[英]Moving a file and renaming it after the directory which contains it on Bash
我正在嘗試在Linux上學習bash,只是為了好玩。 我認為有一個將類似文件組合在一起的.sh會非常有用。 例如,假設我們有目錄
/主頁/文檔/
在目錄中我們有/ mathdocs /,/ codingdocs /等。
在這些子目錄中,我們都有doc.txt。 子目錄上所有文件的名稱相同。
假設我想將它們組合在一起,我想將所有文件移動到/ home / allthedocs /並在它們所在的目錄之后重命名它們。(mathdocs.txt,codingdocs.txt等)
我怎么能這樣做?
我試圖創建一個基於ls和cp命令的腳本,但我不知道如何在移動它們之后將目錄名稱重命名為其中的文件。 我想它必須是某種迭代句子(對於Y目錄上的X)但我不知道該怎么做。
您可以使用mv
一次性移動和重命名文件,並使用循環通過glob抓取所有文件:
#!/bin/bash
dest_dir=/home/allthedocs
cd /home/docs
for file in */doc.txt; do
[[ -f "$file" ]] || continue # skip if not a regular file
dir="${file%/*}" # get the dir name from path
mv "$file" "$dest_dir/$dir.txt"
done
有關更多信息,請參閱此帖子:
這是一個單線程解決方案,用於處理文件名中的空格,就像@codeforester的解決方案對glob一樣。
請注意,使用傳遞給“find”的“-print0”選項,while循環中的內部字段分隔符(IFS)以及帶引號的file3變量包裝來處理空格。
從file2到file3的參數替換擺脫了前導“./”。
move命令中的參數substition將路徑轉換為文件名(在/ home / docs /下運行):
find . -maxdepth 2 -mindepth 2 -print0 | while IFS= read -r -d '' file; \
do file2=$(printf '%s\n' "$file"); file3=${file2#*\/*}; \
mv "$file2" ../allsil/"${file3//\//}"; done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.