Find

如何根據副檔名查找和復製文件?

  • August 1, 2020

我有一個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>

可以找到文件並複製到每個擴展目錄的命令是什麼?

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 {} +

執行zsh。放入autoload zmv您的~/.zshrc(或者,要嘗試一下,在 zsh 命令行上輸入)。然後您可以使用該zmv功能移動或複製文件。

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

說明:第一個操作數是要移動的文件模式,第二個是替換模式。**/遞歸匹配子目錄中的文件。(.)是一個glob 限定符,它將匹配限制為正常文件(因此我們不會冒險匹配目錄)。在替換模式中,$f指定原始路徑,修飾符 e僅保留副檔名,並t保留完整的基本名稱。

引用自:https://unix.stackexchange.com/questions/355511