bash - tutorial - terminal prompt




如何刪除Posix shell的文件名前綴 (4)

你說POSIX砲彈包括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

如何在Bash中刪除文件名前綴,如下例所示:

XY TD-11212239.pdf

要得到

11212239.pdf

即刪除XY TD-


您也可以使用重命名工具

用自製軟件安裝

brew install rename

然後從目錄中運行下面的命令,從所有文件中刪除“prefix-”

rename -d prefix- *


$ 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 find中不存在的GNU擴展。 POSIX查找沒有提供相應的方法來查找對包含換行符的名稱是安全的文件,使其難以替換。


您提供的信息非常少,但是假設您正在使用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危險,例如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




prefix