尋求以下代碼的幫助。我有一個名為 data 的檔案夾,有 6 個子檔案夾(檔案夾 1、檔案夾 2 等)。每個檔案夾都有一個我想重命名為“notes”的文本檔案,并保留 .txt 擴展名。
到目前為止,我有以下代碼:
for file in data/*/*.txt; do
mv $file "notes"
done
我沒有重命名,而是在我的桌面上獲得了一個“notes.exec”檔案。有沒有人有什么建議?
當我回顯我的第一行時,我知道我得到了正確的檔案:
for file in data/*/*.txt; do
echo $file
done
data/folder1/day4notes.txt
data/folder2/lecturenotes.txt
etc.
uj5u.com熱心網友回復:
尋找
您可以使用find命令-execdir,它將在檔案匹配模式為的目錄中執行您選擇的命令:
find data -type f -name '*.txt' -execdir mv \{\} notes.txt \;
data是find應該遞回查找匹配檔案的目錄的路徑-type f只查找檔案,而不是目錄-name '*.txt'匹配任何以.txt-execdir mv \{\} notes.txtmv {} notes.txt在找到檔案的目錄中運行命令;找到{}的原始檔案名在哪里find。
重擊
EDIT1:要做到這一點,find你不需要處理遞回目錄遍歷(除非你有固定的目錄布局)。您bash可以使用命令設定以下 shell 選項shopt -s:
extglob- 擴展通配符支持(允許撰寫擴展通配符,如**;參見“路徑名擴展”man bash)globstar- 允許**路徑名擴展;**/將匹配任何目錄及其子目錄(請參閱參考資料中的“路徑名擴展”man bash)。nullglob- 允許不匹配檔案的模式(如果目錄沒有任何 .txt 檔案)
以下腳本將遍歷目錄data/并將 .txt 檔案重命名為notes.txt:
#!/bin/bash
shopt -s extglob globstar nullglob
for f in data/**/*.txt ; do
mv $f $(dirname $f)/notes.txt
done
mv $f $(dirname $f)/notes.txt移動(重命名)檔案;$f包含匹配的路徑,例如data/folder1/day4notes.txt并$(dirname $f)獲取該檔案所在的目錄 - 在這種情況下data/folder1,我們只是附加/notes.txt到該目錄。
EDIT2:如果您絕對肯定只想在第一級子目錄中執行此操作,data/則可以省略extgloband globstar(如果您知道每個目錄中至少有一個 .txt ,那么也nullglob)并繼續您發布的模式;但您仍然需要使用mv $f $(dirname $f)/notes.txt重命名檔案。
注意:在嘗試此類事情時,請務必事先進行備份。如果您在任何目錄中有多個 .txt 檔案,它們都將被重命名,notes.txt因此在這種情況下您可能會丟失資料。
uj5u.com熱心網友回復:
我沒有評論的聲譽,但這是一個重復的問題。您可以在此處找到您的問題的更準確答案。這具有您正在使用的確切回圈型別,但也指示如何格式化“mv”行,以便它以您想要的方式重命名。
將目錄中的所有檔案從 $filename_h 重命名為 $filename_half?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422205.html
標籤:
上一篇:Bashfind或xargs只計算一次變數和子shell
下一篇:組合命令的標準輸出流程
