Bash 如何在unix中仅删除ext3?filename.ext1.ext2.ext3
示例文件:filename.ext1.ext2.ext3如何在sun solaris下的unix bash shell中仅删除ext3?在所有目录中:Bash 如何在unix中仅删除ext3?filename.ext1.ext2.ext3,bash,shell,unix,Bash,Shell,Unix,示例文件:filename.ext1.ext2.ext3如何在sun solaris下的unix bash shell中仅删除ext3?在所有目录中: find . -name "*.ext3" | mv '{}' ? 它将是: for i in `find . -type f -name "*.ext3"` ; do mv $i $(echo $i | sed -e '/\.ext3$//') ; done 如果文件中有空格,则可以执行稍微不同的操作: find . -type f -n
find . -name "*.ext3" | mv '{}' ?
它将是:
for i in `find . -type f -name "*.ext3"` ; do mv $i $(echo $i | sed -e '/\.ext3$//') ; done
如果文件中有空格,则可以执行稍微不同的操作:
find . -type f -name "*.ext3" | while read file ; do mv "$file" "$(echo $file | sed -e '/\.ext3$//')" ; done
它将是:
for i in `find . -type f -name "*.ext3"` ; do mv $i $(echo $i | sed -e '/\.ext3$//') ; done
如果文件中有空格,则可以执行稍微不同的操作:
find . -type f -name "*.ext3" | while read file ; do mv "$file" "$(echo $file | sed -e '/\.ext3$//')" ; done
您可以通过管道将
find
命令的输出传输到while read
循环中。即使是带有空格的文件名也将以这种方式正确读取。不要对$(find…)构造中的文件使用。这是非常低效的(查找必须在for循环开始之前完成,名称中带有空格的文件将出现问题,并且它会使命令行缓冲区过载,这将在没有任何指示的情况下发生)
您也可以使用$[var%name}
构造%
表示右小筛选器。它使用匹配的全局变量筛选环境变量的右侧。单个%
表示匹配尽可能小的数量。双%
表示匹配最大的数量。
和
表示字符串的左侧
还要注意在文件名周围使用引号,以防名称中有空格
find . -type f -name "*.ext3" | while read file
do
mv "$file" "${file%.ext3}"
done
使用find.-name“*.exe”可能更安全一些-print0
将文件名与null分隔,而不是返回值。如果文件名中有a,这很有用。然后,您必须设置IFS
变量以处理null,而不是空格、制表符和NL。您可以在读取循环时将find
命令的输出导入。即使是带有空格的文件名将以这种方式正确读取。不要在$(find…
构造中使用for文件。这是非常低效的(查找必须在for循环开始之前完成,它将对名称中带有空格的文件产生问题,并且可能会使命令行缓冲区过载,这将在没有任何指示的情况下发生)
您也可以使用$[var%name}
构造%
表示右小筛选器。它使用匹配的全局变量筛选环境变量的右侧。单个%
表示匹配尽可能小的数量。双%
表示匹配最大的数量。
和
表示字符串的左侧
还要注意在文件名周围使用引号,以防名称中有空格
find . -type f -name "*.ext3" | while read file
do
mv "$file" "${file%.ext3}"
done
使用find.-name“*.exe”可能更安全一些-print0
将文件名与null分隔,而不是返回值。如果文件名中有a,这将非常有用。然后,您必须设置IFS
变量来处理null,而不是空格、制表符和NL。我想去掉扩展名3在这种情况下:不删除文件。mv
重命名文件,它不会删除It、 好的,对不起,我误解了问题。我编辑了回复。带空格的文件名呢?@ghostdog:那又如何?它们是邪恶的,应该指导每个用户不要使用它们。它们使每个UNIX脚本更难编写、维护、理解等。而且,它们也不需要。拜托,几乎没有任何编程语言允许sp变量中的aes,没有人晕倒…:)在这种情况下,我想去掉扩展名3:不删除该文件。mv
重命名该文件,但不删除它。好的,对不起,我误解了问题。我编辑了响应。带空格的文件名怎么办?@ghostdog:怎么办?它们是邪恶的,应该指示每个用户不要使用它们。它们使每个UNIX脚本更加不同很难编写、维护、理解等。此外,它们是不需要的。拜托,几乎没有编程语言允许变量中使用SPAE,也没有人晕倒过…:)-print0
不可移植,使用起来很痛苦。最好是:find-type f-name'*.ext3'-exec-rename'.ext3'{}+
@michal gorny:我不熟悉Unix中的rename
命令。在find
命令的GNU、BSD和SysV版本中,-print0
扩展是标准的。不标准的是解释它的xargs
。但是,只要文件名不包含,代码就应该可以工作。我考虑了using-exec
,但问题是用户希望将文件foo.bar.txt.ext3
重命名为foo.bar.txt
。${word%glob}-exec
在BASH中的语法将是完美的,但不能与-exec
一起使用,因为-exec
不调用shell。因此,管道传输到while read是最好的方法。黑客攻击-exec
的一种方法是:查找-type f-name'*.ext3'-exec sh-c'代表fn;do mv“${fn}”“${fn%.ext3}”;done“忽略{}”+
但这已经让人害怕了,而且对'sh-c命令argv'的可移植性也不确定(尽管它可以与bash、dash和posh一起使用)。-print0
不可移植,使用起来很痛苦。最好的方法是:查找-type f-name'*.ext3'-exec-rename'.ext3'{}+
@michal gorny:我不熟悉Unix中的rename
命令。在find
命令的GNU、BSD和SysV版本中,-print0
扩展是标准的。不标准的是解释它的xargs
。但是,只要文件名不包含,代码就应该可以工作。我考虑了using-exec
,但问题是用户希望将文件foo.bar.txt.ext3
重命名为foo.bar.txt
。${word%glob}-exec
在BASH中的语法将是完美的,但不能与-exec
一起使用,因为-exec
不调用shell。因此,管道传输到while read是最好的方法。黑客攻击-exec
的一种方法是:查找-type f-name'*.ext3'-exec sh-c'代表fn;do mv“${fn}”“${fn%.ext3}”;done“忽略{}”+
但是t