如何使用Posix shell删除文件名前缀

时间:2012-05-10 14:18:41

标签: bash shell prefix

如何在Bash中删除文件名前缀,如以下示例所示:

XY TD-11212239.pdf

获取

11212239.pdf

即删除XY TD-

5 个答案:

答案 0 :(得分:29)

您提供的信息很少,但假设您在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

作为旁注,请勿使用ls获取文件列表。 That's a horrible mistake。如果您需要获取要使用的文件列表并在多个地方引用,我建议将它们放在一个数组中:

files=(*)

然后使用此数组。


由于受欢迎的请求(下面的单个评论),以下是如何重命名目录中以XY TD-开头的所有文件,以便删除前缀(感谢@tripleee):

for file in prefix*;
do
    mv "$file" "${file#XY TD-}"
done

答案 1 :(得分:26)

你说 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

答案 2 :(得分:4)

您还可以使用重命名工具

使用自制软件安装

brew install rename

然后从目录中运行以下命令以从所有文件中删除“prefix-”

rename -d prefix- *

答案 3 :(得分:2)

除了在其他答案中显示的子字符串提取外,您还可以使用子字符串替换。鉴于文件:

fn="XY TD-11212239.pdf"

然后子串替换:

fn_new=${fn//*TD-/}

也会做你想做的事。

答案 4 :(得分:1)

$ 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形式的管道替换它。

类似地,-print0是POSIX查找中不存在的GNU扩展。

指出,POSIX find没有提供相同的方法来查找对包含换行符的名称安全的文件。