異なるディレクトリにある複数のファイルを 1 つの一意のディレクトリに移動するにはどうすればよいですか?

異なるディレクトリにある複数のファイルを 1 つの一意のディレクトリに移動するにはどうすればよいですか?

ディレクトリが 220 個あり、各ディレクトリには 2 つのファイルがあります。すべてのファイルの拡張子は同じです (*.fq.gz)。これらすべてのファイルを 1 つの一意のディレクトリに移動したいと考えています。

シェル ループでそれができると思うのですが、その方法がわかりません...

答え1

これは、特に注意する必要がないときに使用するものです

mkdir unique_dir && mv */*.fq.gz unique_dir/

何か見逃していない限り。

答え2

おっしゃる通りです。このタスクは 2 つの for ループで実行できます。1 つはもう 1 つのループ内にあります。そのための bash スクリプトを作成します。どのようになるか見てみましょう。

#!/bin/bash

for dir in */; do
  echo "$dir"
  cd "$dir"
  for file in *; do
    echo "moving $file" 
    mv $file ~/targetdir    
  done
  cd ..
done

スクリプトを高速化したい場合は、スクリプトからエコーを削除するだけです。進行状況を簡単に追跡できるようにするためにこれを作成しました。

ファイルを作成し、これらのコマンドをコピーします。その後、実行権限を付与しchmod +x scriptfile、他のディレクトリが配置されているメイン ディレクトリで実行します./scriptfile。targetdir と scriptfile をターゲット ディレクトリとスクリプト ファイル名に置き換えることを忘れないでください。

ディレクトリ内にさらにファイルがある場合は、ループ内で*を に置き換えるだけで、2 つのファイルのみが反復処理されます。*.fq.gzfor file

警告!!! メイン ディレクトリ内にターゲット ディレクトリを作成しないでください。メイン ディレクトリ内でも反復処理が行われるためです。


編集: @steeldriver が提案したように、for dirコマンドを削除して、for fileコマンドのみを使用して*/*.fq.gzループを高速化できます。ディレクトリ内で何が起こっているかをより適切に追跡するために、これらを維持することにしました。

編集: @waltinator が回答した find および xarg コマンドのマニュアル ページと Web ページで調査したところ、これがより便利で、高速で、安全であることがわかりました。find コマンドの -exec オプションを使用して、xarg の代替手段も見つけましたfind . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;

答え3

多数のファイルや奇妙な名前のファイルを扱う場合は、findとというxargsツールを使用します。man find;man xargs次のような内容を読んで実行してください。

dest=../destination # must be outside this directory tree
mkdir $dest

find . -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

結果に満足したら、「echo mv」を「 」に置き換えますmv

現在のディレクトリ内の難易度を除外するには$dest、次を使用します--prune

find . -type d -name "$dest" -prune -o -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

答え4

krusader can search files and save to a custom tab then you can select all of those (or filter the list) and move them to the destination

sudo apt install krusader

加えてもいいでしょう

sudo apt install krename

最上位のソースディレクトリツールに移動して、検索するか、Ctrl + S でフィードをクリックしてリストボックスを編集し、すべてのファイルを選択して他のパネルにコピーするか、F5 で他のパネル(ソースターゲットである他のタブ)にコピーします。

関連情報