Find

使用查找和重命名遞歸地將使用者定義的字元串添加到所有文件和文件夾

  • June 29, 2020

使用查找和重命名遞歸地將使用者定義的字元串添加到所有文件和文件夾。

我想將“x”(不帶引號)添加到目錄及其所有子目錄中的所有內容。我是使用 macOS Mojave 10.14.6 和終端的初學者。為此,我使用 Homebrew 下載了重命名。

例子:

/Old Project  
/Old Project/Abstract.rtf  
/Old Project/Manuscript.docx  
/Old Project/Data Analysis  
/Old Project/Data Analysis/Working Syntax.sps  
/Old Project/Data Analysis/Working Data.sav  
/Old Project/Data Analysis/Cleaned Data.sav  
/Old Project/Data Analysis/Figures  
/Old Project/Data Analysis/Figures/Figure 1.png  
/Old Project/Data Analysis/Figures/Figure 2.png   
/Old Project/Data Analysis/Raw Data  
/Old Project/Data Analysis/Raw Data/2020-06-26.csv  
/Old Project/Ethics 
/Old Project/Ethics/Application.pdf  
/Old Project/Ethics/Approval.pdf  
/Old Project/Ethics/Informed Consent.docx   

期望的結果:

/x Old Project  
/x Old Project/x Abstract.rtf  
/x Old Project/x Manuscript.docx  
/x Old Project/x Data Analysis  
/x Old Project/x Data Analysis/x Working Syntax.sps  
/x Old Project/x Data Analysis/x Working Data.sav  
/x Old Project/x Data Analysis/x Cleaned Data.sav  
/x Old Project/x Data Analysis/x Figures  
/x Old Project/x Data Analysis/x Figures/x Figure 1.png  
/x Old Project/x Data Analysis/x Figures/x Figure 2.png   
/x Old Project/x Data Analysis/x Raw Data  
/x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv  
/x Old Project/x Ethics 
/x Old Project/x Ethics/x Application.pdf  
/x Old Project/x Ethics/x Approval.pdf  
/x Old Project/x Ethics/x Informed Consent.docx 

到目前為止我有什麼:

find . -depth (-execdir OR -exec) rename -n ’s/^/x /‘ {} +

find . 遞歸列出目前工作目錄中的所有文件和目錄。將輸出包含路徑的文件名列表。

-depth指示 find 從最低深度(在子目錄的底部)開始,因此您不會遇到由於該路徑不再存在而無法在重命名目錄中找到未重命名文件的問題。(如何讓這個查找和重命名命令與子目錄一起使用?

-execFind 將對列表中的每個項目執行命名命令(重命名)。

-execdirFind 將對列表中的每個項目執行命名命令(重命名),但有一個區別 - 它會首先進入每個子目錄,然後僅將文件名傳遞給重命名命令(無路徑)。

rename使用 Perl 正則表達式的重命名命令。它不能自己處理遞歸文件重命名,這就是它需要 find 的原因。顯然,在某些系統上它是標準命令,而在其他系統上還有另一個重命名命令是標準命令,導致一些混亂。

-n指示重命名以顯示將發生的情況,而不是實際執行它。

’s///‘告訴 rename 進行替換,將第一部分替換為第二部分。在我的語法 ( ’s/^/x /‘) 中,將 ^ (文件名開頭的標記)替換為 x 。

{}將重命名指向 find 中的文件列表。

+告訴 find 命令結束。


-exec相對-execdir

**-exec**傳遞完整的文件路徑。重命名作用於重命名文件中概述的完整文件路徑以及類似問題的答案:

“請注意,重命名將在整個路徑上執行,而不僅僅是文件名。” (http://plasmasturm.org/code/rename/

“臨時說明:有問題 - 重命名模式不處理具有 >path 的文件名;我正在修復”(https://unix.stackexchange.com/a/153489

因此,如果我使用-exec,例如,我會得到“x /Old Project/Data Analysis/Figures/Figure 1.png”而不是“/Old Project/Data Analysis/Figures/x Figure 1.png”。為了解決這個問題,我相信我必須編寫一個複雜的正則表達式來以某種方式僅擷取文件名部分,如對類似問題的回答中所述:

“如果你只想修改最後一個組件,你可以將你的正則表達式錨定在(\A|?<=/),並確保它不匹配任何 / 並且只匹配最後一個 /。” (https://unix.stackexchange.com/a/166886

我嘗試了這個答案中給出的正則表達式,但它導致了一個錯誤(“Quantier 在正則表達式中沒有任何內容……”),我實際上不確定它是否適用於我的重命名版本。

**execdir**傳遞唯一的文件名,這是有希望的。事實上,當我試執行命令時,所有計劃中的更改看起來都很完美。但是,實際結果不是 - 它重命名主目錄中的文件和文件夾,但找不到所有其他文件和文件夾。它說它們不存在。

我最終找到了這個答案:

“查找-execdir | 改名

如果不是因為相對路徑的瘋狂,這將是最好的方法,因為它避免了 Perl 正則表達式 fu 只對基本名稱起作用:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \

find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;

-execdir 首先 cds 進入目錄,然後僅在基本名稱上執行。

不幸的是,我無法擺脫那個 PATH hacking 部分,如果你在 PATH 中有相對路徑, find -execdir 拒絕做任何事情……”(將目錄下的所有目錄小寫

因此,據我了解,該命令在理論上有效,這就是它在試執行中有效的原因,但在實踐中,它find拒絕實際進入重命名命令的每個子目錄。


我的問題:

  1. 對於使用exec:有沒有辦法將文件名與重命名的完整文件路徑隔離開來?
  2. 對於使用execdir:有沒有辦法讓 find 使用或獲取絕對路徑名?

筆記

我對程式很陌生。

我找到了這個非常徹底的答案(https://stackoverflow.com/a/54163971/13821837),但語法與我的系統不匹配。

使用gnu工具:

首先通過安裝GNU find

brew install findutils

然後:

gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;

perl重命名。

當輸出看起來不錯時移除-n開關。

筆記

  • -depth這裡非常重要,它在重命名目錄之前遍歷目錄中的第一個文件。(降序,此處為必填項)。
  • -nfromrename代表空執行

檢查正則表達式解釋

替換部分x $&錶示文字x+space和替換左側的最後一個完全匹配s///

本地測試:

./Old Project
./Old Project/Manuscript.docx
./Old Project/Data Analysis
./Old Project/Data Analysis/Working Syntax.sps
./Old Project/Data Analysis/Raw data
./Old Project/Data Analysis/Working Data.sav
./Old Project/Data Analysis/Figures
./Old Project/Data Analysis/Figures/Figure 2.png
./Old Project/Data Analysis/Figures/Figure 1.png
./Old Project/Data Analysis/Raw Data
./Old Project/Data Analysis/Raw Data/2020-06-26.csv
./Old Project/Data Analysis/Cleaned Data.sav
./Old Project/Ethics
./Old Project/Ethics/Informed Consent.docx
./Old Project/Ethics/Application.pdf
./Old Project/Ethics/Approval.pdf
./Old Project/Abstract.rtf

處理後:

./x Old Project
./x Old Project/x Manuscript.docx
./x Old Project/x Data Analysis
./x Old Project/x Data Analysis/x Cleaned Data.sav
./x Old Project/x Data Analysis/x Figures
./x Old Project/x Data Analysis/x Figures/x Figure 2.png
./x Old Project/x Data Analysis/x Figures/x Figure 1.png
./x Old Project/x Data Analysis/x Raw Data
./x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
./x Old Project/x Data Analysis/x Raw data
./x Old Project/x Data Analysis/x Working Data.sav
./x Old Project/x Data Analysis/x Working Syntax.sps
./x Old Project/x Ethics
./x Old Project/x Ethics/x Application.pdf
./x Old Project/x Ethics/x Approval.pdf
./x Old Project/x Ethics/x Informed Consent.docx
./x Old Project/x Abstract.rtf

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