Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用Posix shell删除文件名前缀_Bash_Shell_Prefix - Fatal编程技术网

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

Bash 如何使用Posix shell删除文件名前缀,bash,shell,prefix,Bash,Shell,Prefix,如何在Bash中删除文件名前缀,如以下示例所示: XY TD-11212239.pdf 得到 11212239.pdf i、 e,删除XY TD-?您提供的信息很少,但假设您在bash中执行此操作,并且有一个需要删除前缀的文件列表,则可以通过sed来传输该列表: 例如: ./generate_your_list_of_files | sed -e 's/^prefix//' 或者,如果文件列表以空格分隔: echo TD-file1 TD-file2.x.yt TD-file3-beep

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

XY TD-11212239.pdf
得到

11212239.pdf

i、 e,删除
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'
然后使用这个数组


由于受欢迎的请求(下面的一条注释),下面介绍如何重命名目录中以
XY TD-
开头的所有文件,从而删除前缀(感谢@tripleee):


您还可以使用重命名工具

用自制软件安装它

brew安装重命名

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

重命名-d前缀-*

$ 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)
而IFS=read-r-d“”文件名;做
mv“$filename”“${filename#XY TD-}”

完成<除了其他答案中显示的子字符串提取外,您还可以使用子字符串替换。给定文件:

fn="XY TD-11212239.pdf"
然后子串替换:

fn_new=${fn//*TD-/}
也会做你想做的。

你说的POSIX外壳包括BASH、Kornshell、Ash、Zsh和Dash。幸运的是,所有这些shell都对变量值进行模式过滤

模式是在Unix/Linux命令行上指定带有
*
之类内容的文件时使用的模式:

$ ls *.sh  # Lists all files with a `.sh` suffix
这些POSIX外壳使用四种不同的模式过滤:

  • ${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

Linux是一个内核。你实际上是指[bash]或[sh](或另一个shell)吗?@Shahbaz的编辑:虽然OP可能是指“shell”,但实际上甚至可以通过编写一个C程序来实现。我的意思是:最好让OP澄清他是否指“shell”。@ArjunShankar,我从标题中删除了shell,但从他执行命令的方式(
XY file name
)来看,我仍然相信他想在shell中执行它。@Shahbaz:Hmm。。但是OP说,
XY TD-
是他想要删除的“文件名前缀”。那么“XY”可能不是shell命令。@hamid-是否要重命名删除前缀的文件?您想在shell(如bash)中还是在程序(哪种语言?)中执行此操作?OP也可能希望“重命名”原始文件。这些问题实在太模糊了,无法充分回答。@tripleee,谢谢你让我知道。实际上,我只是最近才学习bash的脚本语言。我已经更新了我的答案。。。。为了提高效率和正确性,
mv“$file”${file#XY\TD-}”
带有正确的引用和shell内置的替换机制。@tripleee,同样感谢您提供的精彩链接。作为一名shell编程新手,我真的会爱上那些无用的用法;执行mv$file
echo$file | sed-e的/^PM ID-/'
;完成//此代码无法从文件名中删除前缀PM ID-nice powerfull tool!这挽救了我今天的理智。谢谢
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