拡張子に基づいてファイルを見つけてコピーする方法は?

拡張子に基づいてファイルを見つけてコピーする方法は?

photorec復元されたファイルを含む2481個のフォルダを含むデータ回復プロセスのフォルダがあります。

フォルダ名の順序はrecup_dir.1、recup_dir.2 ... recup_dir.2481です。

以下を使用して、このフォルダのすべての拡張子のリストを取得しました。

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

photorecorgしたがって、上記のコマンドで取得した各拡張子に対応するフォルダのリストを含む別のディレクトリを作成しました。

mkdir 7z arj asf avi bat blend bmp bz2 cdr DOC docx flac flv gif gz html jpg mobi mov mp3 mp4 mpg ods odt ogg pdf php png ppt ps psd rar rtf svg swf tar tif ttf wav wmf xcf xls xlsx xz zip

これで、フォルダ内のファイルをphotorec次の拡張フォルダにコピーする必要がありますphotorecorg

想像find . -print | xargs cp $0 ../photorecorg/<extension>

各拡張ディレクトリにファイルを見つけてコピーできるコマンドは何ですか?

答え1

photorec='/pathto/your_photo_recovery_folder'
photorecorg='/pathto/your_photo_recorg_folder'

cd "$photorec" && \
   EXTDIR="$photorecorg" find . -type f -name '*.?*' -exec sh -c '
      for f
      do
         dest=${EXTDIR}/${f##*.}
         cp -p "$f" "$dest/."
      done
   ' x {} +

答え2

走る扱いにくいautoload zmv直接入力してください~/.zshrc(または試してみるには、zshコマンドラインに入力してください)。その後利用できますzmv機能ファイルを移動またはコピーします。

mv -Q '**/*(.)' '$f:e/$f:t'

説明: 最初のオペランドは移動するファイルのモードで、2 番目のオペランドは代替モードです。**/サブディレクトリのファイルを再帰的に一致させます。(.)はいグローバル予選、一致を通常のファイルに制限します(したがって、ディレクトリ一致のリスクはありません)。交換モードでは、$f元のパスを指定し、修飾子 e拡張子のみが保持され、完全なデフォルトt名は保持されます。

答え3

@user218374に加えてmkdir -p

photorec='/media/TiloDataRecoveryRAW'
photorecorg='/media//TiloDataRecoveryOrg'

cd "$photorec" && \
   EXTDIR="$photorecorg" find . -type f -name '*.?*' -exec sh -c '
      for f
      do
         dest=${EXTDIR}/${f##*.}
         mkdir -p "$dest" && cp -p "$f" "$dest/."
      done
   ' x {} +

関連情報