ファイルシステムを横断してファイルを移動する

ファイルシステムを横断してファイルを移動する

ディレクトリのリストにアクセスし、不要なファイル タイプのファイルを別のディレクトリに移動するスクリプトを作成する必要があります。

以下のコードを使用すると、ディレクトリ内のすべてのフォルダを反復処理して、その名前を印刷できます。これらのフォルダに対して 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それらのディレクトリからすべてのファイルを目的のディレクトリにコピーします。ここでは絶対パスを使用しているため、このスクリプトは任意の場所から実行できます。

関連情報