[英]How to remove filename prefix with a Posix shell
如何在Bash中刪除文件名前綴,如以下示例所示:
XY TD-11212239.pdf
要得到
11212239.pdf
即,刪除XY TD-
?
您提供的信息很少,但假設您在bash中執行此操作,並且有一個需要刪除前綴的文件列表,您可以通過sed
管道列表:
例如:
./generate_your_list_of_files | sed -e 's/^prefix//'
或者如果您的文件列表是空格分隔的:
echo TD-file1 TD-file2.x.yt TD-file3-beep | sed -e 's/\<TD-//g'
第一個匹配行的開頭的前綴並刪除它。 第二個匹配TD-
(或任何其他你想要替換的前綴),只有當它發生在一個單詞的開頭並在所有行的所有匹配中替換它時。 這可能會變得危險,例如像TD-file\\ that\\ TD-contains\\ space.txt
file\\ that\\ contains\\ space.txt
成為file\\ that\\ contains\\ space.txt
作為旁注,請不要使用ls
獲取文件列表。 那是一個可怕的錯誤 。 如果您需要獲取要使用的文件列表並在多個地方引用,我建議將它們放在一個數組中:
files=(*)
然后使用此數組。
由於受歡迎的請求(下面的單個評論),這里是如何重命名目錄中以XY TD-
開頭的所有文件,以便刪除前綴(感謝@tripleee):
for file in prefix*;
do
mv "$file" "${file#XY TD-}"
done
你說POSIX shell包括BASH,Kornshell,Ash,Zsh和Dash。 幸運的是,所有這些shell都對變量值進行模式過濾 。
模式是在Unix / Linux命令行中使用*
之類的文件指定文件時使用的模式:
$ ls *.sh # Lists all files with a `.sh` suffix
這些POSIX shell使用四種不同的模式過濾:
${var#pattern}
- 從左側移除與模式匹配的最小字符串。 ${var##pattern}
- 從左側移除與模式匹配的最大字符串。 ${var%pattern}
- 從右側刪除與模式匹配的最小字符串。 ${var%%pattern}
- 從右側刪除與模式匹配的最大字符串。 這里有一些例子:
foo="foo-bar-foobar"
echo ${foo#*-} # echoes 'bar-foobar' (Removes 'foo-' because that matches '*-')
echo ${foo##*-} # echoes 'foobar' (Removes 'foo-bar-')
echo ${foo%-*} # echoes 'foo-bar'
echo ${foo%%-*} # echoes 'foo'
你沒有真正解釋你想要什么,而且你沒有包含任何代碼示例,因此很難想出能夠做你想做的事情。 但是,使用模式過濾,您可以准確地確定要對文件名執行的操作。
file_name="XY TD-11212239.pdf"
mv "$file_name" "${file_name#*-}" # Removes everything from up to the first dash
您也可以使用重命名工具
用自制軟件安裝它
brew install rename
然后從目錄中運行以下命令以從所有文件中刪除“prefix-”
rename -d prefix- *
除了在其他答案中顯示的子字符串提取外,您還可以使用子字符串替換。 給定文件:
fn="XY TD-11212239.pdf"
然后子串替換:
fn_new=${fn//*TD-/}
也會做你想做的事。
$ s='XY TD-11212239.pdf'
$ echo "${s#XY TD-}"
11212239.pdf
如果您的目標是執行批量重命名:
while IFS= read -r -d '' filename; do
mv "$filename" "${filename#XY TD-}"
done < <(find . -type f -name 'XY TD-*' -print0)
請注意, <()
是POSIX sh中不存在的bash擴展。 您可以使用find ... | while
形式的管道替換它 find ... | while
。
類似地, -print0
是POSIX查找中不存在的GNU擴展。 POSIX find沒有提供定位文件的等效方法,這對於包含換行符的名稱是安全的,因此很難替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.