Linux

扁平化具有重複文件名的複雜文件夾結構

  • January 8, 2016

我有一個文件夾結構複雜的文件夾:

├── folder1
│   ├── 0001.jpg
│   └── 0002.jpg
├── folder2
│   ├── 0001.jpg
│   └── 0002.jpg
├── folder3
│    └── folder4
│         ├── 0001.jpg
│         └── 0002.jpg
└── folder5
    └── folder6
          └── folder7
               ├── 0001.jpg
               └── 0002.jpg   

我想展平文件夾結構,使所有文件都位於具有唯一名稱的父目錄中,例如 folder1_0001.jpg、folder1_0002.jpg… folder5_folder6_folder7_0001.jpg 等。

我試圖使用“扁平化文件夾結構”中建議的程式碼

$ find */ -type f -exec bash -c 'file=${1#./}; echo mv "$file" "${file//\//_}"' _ '{}' \;

echo證明它正在工作:

mv folder3/folder4/000098.jpg folder3_folder4_000098.jpg

但是輸出文件沒有放在父目錄中。我已經搜尋了整個驅動器,但找不到輸出文件。

我還嘗試過“將文件夾結構展平為 Bash 中的文件名”

$ find . -type f -name "*.jpg" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh

-v證明它正在工作:

‘./folder3/folder4/000098.jpg’ -> ‘._folder3_folder4_000098.jpg’

但是,輸出會在父目錄中創建隱藏文件,這使我的工作流程變得複雜。我可以使用查看父目錄中的這些隱藏文件ls -a

我還嘗試了以下“使用展平文件夾命令重命名重複文件”中的建議程式碼

find . -mindepth 2 -type f | xargs mv --backup=numbered -t . && find . -type d -empty -delete

但是該命令會覆蓋具有相似文件名的文件。

關於如何在不覆蓋具有相似名稱的文件的情況下展平復雜的文件夾結構的任何建議?目前的解決方案似乎只適用於一層深的文件夾結構。

我的最終目標是將唯一名稱轉換為序號,如“將文件夾中的文件重命名為序號”中所述

a=1
 for i in *.jpg; do
 new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
 mv -- "$i" "$new"
 let a=a+1
done

我不知道為什麼您問題中的第一個解決方案不起作用。我只能假設您忘記刪除echo. 儘管如此,假設您正在執行,這是另一種方法也應該滿足您的需要bash

shopt -s globstar
for i in **/*jpg; do mv "$i" "${i//\//_}"; done

解釋

  • shopt -s globstar打開 bash 的功能globstar,它可以**遞歸匹配任意數量的目錄或文件。
  • for i in **/*jpg;將遍歷名稱以 . 結尾的所有文件(或目錄).jpg,將每個文件保存為$i.
  • "${i//\//_}"是目前文件(或目錄)的名稱,其中所有實例都/替換為_.

如果您還可以擁有名稱以結尾的目錄.jpg並希望跳過它們,請改為執行以下操作:

shopt -s globstar
for i in **/*jpg; do [ -f "$i" ] && echo mv "$i" "${i//\//_}"; done

對於所有文件,無論副檔名如何:

shopt -s globstar
for i in **/*; do [ -f "$i" ] && echo mv "$i" "${i//\//_}"; done

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