我已經在多個目錄中,所有對文件名以下設置了許多文件:出口的文件名臨時文件慶典
prob123456_01
我想刪除尾隨「_01」關每個文件名和將它們導出到臨時文件。我究竟如何刪除尾部「_01」以及導出?我對腳本相當陌生,所以任何幫助將不勝感激!
我已經在多個目錄中,所有對文件名以下設置了許多文件:出口的文件名臨時文件慶典
prob123456_01
我想刪除尾隨「_01」關每個文件名和將它們導出到臨時文件。我究竟如何刪除尾部「_01」以及導出?我對腳本相當陌生,所以任何幫助將不勝感激!
如果我理解正確,您需要一個沒有尾隨_01
的文件名列表。下面要這麼做:
find . -type f -name '*_01' | sed 's/_01$//' > tmp.lst
find . -type f -name '*_01'
會在當前目錄下的所有文件,其後代的目錄,對於在_01
結尾的名稱的文件。
|
是所謂的管道,將左手調用的結果交給右手調用。
sed 's/_01$//'
從每個文件名的末尾刪除_01
。
> tmp.lst
結果寫入文件tmp.lst
這些是bash
和喜歡的工作都非常基本的部分,所以它可能是一個好主意,看看一個或兩個教程,並與那些熟悉和其他幾個人;)
謝謝!我一直在努力去熟悉自己,但我變得很難過。另外,我會怎樣修改find語句來查找任何具有「_」的文件,最後是任何兩個整數? (不只是01) – Will
@你可以改變模式爲''* _ [0-9] [0-9]'' –
正如您所標記bash,我會假設你可以使用globstar
shopt -s globstar # enable globstar
for f in **_[0-9][0-9]; do echo "${f%_*}"; done > tmp
隨着globstar
已啓用,模式**_[0-9][0-9]
與當前目錄和任何子目錄中以_
結尾的任何文件(後跟任意2位數字)匹配。 ${f%_*}
使用bash的內置字符串操作功能刪除文件名的結尾。
然而,當Charles Duffy建議(感謝),你可以使用一個數組,而不是一個循環:
files=(**_[0-9][0-9]); printf '%s\n' "${files[@]%_*}"
該數組作爲填充之前匹配相同模式的文件名。 ${files[@]%_*}
從數組的每個元素中刪除最後一部分,並將它們全部作爲參數傳遞給printf
,後者在單獨的行上打印每個結果。
這兩種方法中的任何一種都可能比使用find
更快,因爲一切都在shell中完成,而不執行任何單獨的進程。
此前我曾建議使用**_{00..99}
這種模式,雖然由於幾個原因,這並不理想。它效率較低,因爲它擴大到**_00
,**_01
,**_02
,...
, **_99
。此外,除非啓用另一個選項nullglob
,否則這100個不匹配的模式中的任何一個都將被直接包含在輸出中。
無論您使用的是[0-9]
還是[[:digit:]]
,但後者的優點是它匹配所有定義爲數字的字符,這取決於您的語言環境,可能會有所不同。如果這不是問題,我會和前者一起去。
你是什麼意思將它們導出到臨時文件_?你的意思是每個文件名都應該打印到文件中?你能否更清楚地瞭解每個文件名所遵循的模式? –
你想如何表示臨時文件中的文件名?請注意,UNIX上的文件名可以包含文字換行符,因此試圖通過在文件名之間添加換行符來分隔文件名流,攻擊者可以控制這些名稱來濫用文件名。 –