ディレクトリが 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.gz
for 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 で他のパネル(ソースターゲットである他のタブ)にコピーします。