如何根据扩展名查找和复制文件?

如何根据扩展名查找和复制文件?

我有一个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'

解释:第一个操作数是要移动的文件的模式,第二个操作数是替换模式。**/以递归方式匹配子目录中的文件。(.)全局限定符,它将匹配限制为常规文件(因此我们不会冒险匹配目录)。在替换模式中,$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 {} +

相关内容