簡體   English   中英

如何使用Posix shell刪除文件名前綴

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM