次の名前を持つ複数のディレクトリがあります。
15mar20a_00021sq_v01_00019en.frames
15mar20a_00021sq_v01_00020en.frames
and so on...
各ファイルには、.raw拡張子を持つ7つのファイルが含まれています。ディレクトリの1つにあるファイルの例は次のとおりです。
IntermediateImage_20150320_180411_n0.raw
IntermediateImage_20150320_180411_n1.raw
IntermediateImage_20150320_180411_n2.raw
...until n7.raw
スクリプトが各ディレクトリに移動し、.raw
親ディレクトリの外側にある新しいディレクトリにファイルをコピーして、練習の.raw
終わりにすべてのファイルを同じ場所に保持できるようにします。
どんな助けでも大変感謝します。
答え1
この*frames
ディレクトリがすべて同じディレクトリにあると仮定すると、次のようにできます。
cd to/the/parent/of/the/frames/dirs
mkdir all-my-raws
cp *.frames/*.raw all-my-raws/
ファイルの重複を避けるためcp
に置き換えてln
、同じデータへの新しいリンクのみを作成できます。
答え2
この目的に使用できますfind
。
find /path/to/directories -type f -name "*.raw" -exec cp {} /new/path \;
ファイルをコピーする代わりに移動するには、ファイルを移動した後に次のように空のディレクトリを削除できますcp
。mv
find /path/to/directories -type d -empty -exec rmdir {} \;
答え3
私が提案する解決策:
Bash配列のすべてのディレクトリのリストを収集します。このように、
dirs=($(ls *.frames))
配列にはすべてのディレクトリ名が含まれます。次のようなものを使用して、範囲全体でループを実行します。
for i in ${$dirs[@]}; do......
ループ内でどこかに新しいディレクトリを作成し、現在のディレクトリ内のすべてのファイルをその場所に移動します。それはまるで
for i in ${$dirs[@]}; do mkdir dir_$i mv ($i)/*.raw dir_$i/ done
少し調整が必要な場合がありますが、これがうまくいくと確信しています。
PS - 新しいディレクトリを作成するより良い方法を試してください。 :P