「target」というフォルダーを含む 1 つのフォルダーに 100 個のファイルがあります。このフォルダー内のすべてのファイルをフォルダー target に移行したいと考えています (target フォルダー自体は除く)。
これを行うための効率的なターミナルコマンドはありますか?
答え1
ディレクトリ内にファイル (およびディレクトリ ターゲット) のみがある場合は、 ではmv
なくを使用しますfind
。
mv * target
「ターゲット」はそれ自体では移動できないというエラーが表示されますが、その後、ファイルはすべてターゲット内に移動します。
答え2
これを使って
$ mv target ..
$ mv * ../target
$ mv ../target .
答え3
これも同様に機能します:
find . -maxdepth 1 ! -name target ! -name . -exec mv "{}" target \;
bash 補完に頼りすぎることの主な利点の 1 つは、find
隠しファイルも同時に取得できることです。mv * ...
これは行いません。
おそらく次のようなものになると思います:
mv -t target * .[^.]*
または、James が指摘しているように、find コマンドを簡略化してファイルのみを検索するようにすることもできます... また、LoremIpsum が指摘したように、ファイルが数十億ある場合は、次のようにするとxargs
少し効率的になります。
find . -maxdepth 1 -type f -print0 | xargs -0 mv -t target
答え4
宛先ディレクトリを前のディレクトリに移動し、すべてのものをそこに移動し、最後に現在のディレクトリに戻すというアプローチは問題ありません。唯一の問題は、履歴を保持する必要のある git プロジェクト ディレクトリでは機能しないことです。
したがって、git ディレクトリの場合は次のように移動します。git mv * ターゲット -k
の-kオプションは移動/名前変更エラーをスキップするために使用されます