フォルダーを移動する必要はなく、ファイルだけを移動します。
mv *
を試しましたが、このコマンドはフォルダーも移動します。
ディレクトリ以外のすべてを$SOURCE_DIR
から$TARGET_DIR
に移動する場合は、次のコマンドを使用できます。
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
詳細な説明:
find
:ディレクトリ内のファイルの検索検索$SOURCE_DIR
:検索するディレクトリ-maxdepth 1
:サブディレクトリ内を検索しない-not -type d
:ディレクトリを無視します-type f
を使用することもできますが、ファイルでもディレクトリでもないものすべて(特にシンボリックリンク)もキャッチするため、上記の方が好きです。-exec mv -t "$TARGET_DIR" -- '{}' +
:mv -t "$TARGET_DIR" -- FILES...
コマンドを実行します。FILES...
は一致するすべてのファイルです(@DavidFoersterに感謝)ファイルのみをmvにしたいと思います。まずディレクトリに移動してこのコマンドを使用し、$ TARGETをターゲットディレクトリパスに置き換えます。ファイルをコピーする場合は、mv
をcp
に置き換えます。
find . -type f -exec mv {} $TARGET \;
これを説明すると、find . -type f
はすべてのファイルを選択することを意味し、-exec mv {} $TARGET \;
は選択されたすべてのアイテムに対してmv
コマンドを実行することを意味します。
前の回答にはエラーがあります。mv
サブディレクトリ内のすべてのファイルも。簡単な修正は-maxdepth 1
を使用することです。そして、サブディレクトリ内のmv
ファイルを再帰的にはしません。以下は正しいものです。
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
ファイルを再帰的に処理する場合は、find
を使用します。この特定のケースでは必要ありませんが、他の答えが示すように、-maxdepth 1
で使用できます。
単純なpythonコマンドでも同様に実行できます。以下に例を示します。
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
はos.listdir('.')
が検出したすべてのアイテムを反復処理し、os.path.isfile()
関数を使用してアイテムがファイルかどうかをテストします。
fl
ファイルリストが作成されたら、map()
関数を使用します。この関数は、関数とアイテムのリストの2つの引数を取ります。リスト内の各ファイルごとに指定した機能を実行します。したがって、ここでは、特定のファイルを特定のディレクトリに移動する匿名関数としてlambda x:shutil.move(x,'./a_directory')
があり、fl
-作成したファイルのリストがあります。
読みやすく一般的に使用するために、これを一般的なpythonスクリプトとして書き換えることもできます。このスクリプトは、ソースディレクトリと宛先サブディレクトリの2つの引数を取ります。
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
そして、使用方法は次のとおりです。
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
Bashの代わりにzshを使用している場合、これを行うことができます。
mv "$SOURCE"/*(.) "$TARGET"
最後の(.)
は、glob修飾子と呼ばれます。内部の.
は、通常のファイルのみに一致することを具体的に意味します。
mv *(.) "$target"
の実行は迅速かつ実用的です。ただし、スクリプトの一部としてこれを行う場合は、代わりにFrxstremとDavid Foresterが提案したmv -t "$target" -- *(.)
のようなものを書いて、他の人の使用で発生する可能性のあるコーナーケースをうまく処理することを検討することをお勧めします。
Pythonで、ディレクトリを除くすべてをsource-dir
ディレクトリからdestination-dir
ディレクトリに移動するには:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
Running Python File in Terminal を参照してください。
私は使用します
mv *.*
これは、フォルダーに拡張子がない限り機能します。