Bash
將文件向上移動一個級別,將文件夾名添加到文件名?
測試環境:
- 創建目錄 from
0
to並用文件 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 相同
dirname
,basename
因此命令的等效形式是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}