遞歸地將嵌套目錄中的特定文件移動到從路徑派生的名稱
我在不同的嵌套目錄中有一些文件。所有文件都命名為
Analysis.mzXML
. 我希望將它們全部放在一個地方,同時根據之前保存的目錄將每個名稱更改為不同的名稱。我知道移動文件並為其指定目錄名稱已在前面的其他問題中顯示,例如this、this和this。
但是,他們僅使用程序將它們移出一個目錄,並且僅根據該目錄更改名稱。就我而言,我希望使用嵌套目錄的整個路徑重命名文件
文件全部保存如下:
/dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML
每個
Analysis.mzXML
都嵌套在不同名稱的文件夾中。但是,dir6
恰好所有文件的名稱都相同,並且由於它沒有提供有價值的資訊,我想跳過它。我的期望是,通過執行一些命令或腳本,我可以得到所有這些文件,並用它們的特定路徑命名,如下所示:
/dir1_dir2_dir3_dir4_dir5.mzXML
我剛剛開始使用 bash,我不確定如何解決這個問題。
如您所寫,您的問題表明您希望在整個文件系統中搜尋
Analysis.mzXML
文件,即使它們出現在/lib/perl5/5.14/Unicode/Collate/Locale
,/proc/sys/net/ipv4/conf/all
,/sys/devices/system/cpu/cpu0/cache
,/usr/share/doc/cmake/html/_sources
或類似的不太可能/不合適的位置 - 並且您希望將文件移動到根目錄中,這似乎不太可能/不合適。我假設您正在從其他目錄工作。執行此命令:
find . -mindepth 7 -maxdepth 7 -type f -name Analysis.mzXML -exec sh -c 'for arg do echo mv -i -- "$arg" "$(echo "$arg" | sed -e "s|^\./||" -e "s|/dir6/Analysis\.mzXML|.mzXML|" -e "s|/|_|g")"; done' sh {} +
-mindepth 7 -maxdepth 7
如果您確定所有Analysis.mzXML
文件都在第七級,則可以省略。此命令查找Analysis.mzXML
第七級的所有文件並將它們傳遞給一個 mini-shell 腳本。這需要每個路徑名,去掉./
開頭和dir6
結尾的 以及Analysis
文件名的一部分,並將所有剩餘的/
字元更改為_
. 這應該產生如下輸出:mv -i -- ./dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML dir1_dir2_dir3_dir4_dir5.mzXML mv -i -- ./the/quick/brown/fox/jumps/dir6/Analysis.mzXML the_quick_brown_fox_jumps.mzXML mv -i -- ./over/the/lazy/dog/foo bar/dir6/Analysis.mzXML over_the_lazy_dog_foo bar.mzXML
如果這看起來正確,請再次執行該命令,但刪除第一個命令
echo
(即更改echo mv
為 justmv
)。筆記:
- 這並不能驗證實際呼叫了第六級目錄
dir6
。如果它在 中找到一個Analysis.mzXML
文件dir11/dir12/dir13/dir14/dir15/dir16
,它將將該文件重命名為dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXML
而不是dir11_dir12_dir13_dir14_dir15.mzXML
.- 如果它試圖將文件移動到一個已經存在的名稱,
-i
它將導致mv
要求確認。--
應該保護您免受以**-
**. 這應該不是問題,因為$arg
應該始終以./
.- 如果您真的想從文件系統根目錄執行此操作,那應該可以。只需
cd /
按照上述說明進行操作即可。事後思考:如果您有一個名為
Analysis.mzXML
. 所以不要那樣做。