
ディレクトリのリストにアクセスし、不要なファイル タイプのファイルを別のディレクトリに移動するスクリプトを作成する必要があります。
以下のコードを使用すると、ディレクトリ内のすべてのフォルダを反復処理して、その名前を印刷できます。これらのフォルダに対して cd を実行する必要があると思います。
for d in */
do
echo "$d"
done
以下のコードは、各 .png ファイルを反復処理し、目的のディレクトリに移動します。
for file in *.png
do
mv "$file" /desired/directory
done
何らかの理由で、最初のコード ブロックに 2 番目のコード ブロックを追加すると、次の出力が表示されます。
mv: cannot stat ‘*.png’: No such file or directory
各ファイルをトラバースして移動させるにはどうしたらいいでしょうか?このスクリプトを/search/directory/のルートに配置したいと思います。
答え1
for d in */
do
mv - n *.png /desired/directory/
done
同じ名前のファイルがある場合、最初のファイルは書き込まれますが、次のファイルは書き込まれません。-n タグが設定されていない場合、2 番目のファイルが最初のファイルを上書きし、最初のファイルが失われます。これにより、サブサブディレクトリ内のファイルはコピーされません。
その使用をやめる
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
しかし、同じ名前のファイルでも同じ問題が発生します
ファイル名を複製したい場合(例:Pic.png 1Pic.png 2Pic.png など)
dup=1
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
while(find /search/directory/ -inane "*.png" | wc -l !=0)
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/$dup$(basename {}) \;
dup++
done
/desired/directory が /search/directory 内にある場合、このループは発生しません。これは思いつきで実行しましたが、唯一心配なのは、while 条件で find | wc を括弧で囲み、先頭に $ を付ける必要があるかもしれないことです。これは、エラー チェックによってさらに改善され、.png /search/directory /desired/directory を引数として持つことができます。
答え2
こうすればできるはずです:
#!/bin/bash
for dir in /full/path/to/recup_Dir.{1..976}; do
mv "$dir"/*.png /full/path/to/desired/directory/
done
ここでは、ソース ディレクトリをループし、.png
それらのディレクトリからすべてのファイルを目的のディレクトリにコピーします。ここでは絶対パスを使用しているため、このスクリプトは任意の場所から実行できます。