Bash

將文件向上移動一個級別,將文件夾名添加到文件名?

  • August 14, 2020

測試環境:

  • 創建目錄 from 0to並用文件 from to9填充它們a``z
$ mkdir {0..9} && touch {0..9}/{a..z}
  • 結果find
$ find -type f
./0/a
./0/b

...

./9/y
./9/z

如何轉換輸出使其看起來像這樣:

./0a    
./0b

...

./9y
./9z

使用 POSIX 工具,

find . -type f -exec sh -c 'for f; do dirn="${f%/*}"; mv -- "$f" "$dirn${f##*/}"; done' sh {} +

find呼叫 shell 並為每個文件執行 for 循環。

  • dirn="${f%/*}"通過排除文件名中最後一個斜杠之後(包括)之後的所有內容來獲取父目錄名稱。
  • ${f##*/}通過排除文件名中最後一個斜杠之前(包括)之前的所有內容來獲取不帶路徑的文件名。

這兩個 shell 結構的作用與 and 相同dirnamebasename因此命令的等效形式是

find . -type f -exec sh -c 'for f; do mv -- "$f" "$(dirname "$f")$(basename "$f")"; done' sh {} +

,雖然這個應該更慢,因為它需要為每個文件生成兩個額外的程序。

如果您不需要進入多個目錄,例如您的範例所示,則可以使用簡單的 shell 循環:

for f in */*; do dirn="${f%/*}"; echo mv -- "$f" "$dirn${f##*/}"; done

使用 Perl 的獨立rename命令:

rename -n 's|/||' */*

如果一切正常,請刪除-n然後刪除剩餘的空目錄。

rmdir {0..9}

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