Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 如何在unix中仅删除ext3?filename.ext1.ext2.ext3_Bash_Shell_Unix - Fatal编程技术网

Bash 如何在unix中仅删除ext3?filename.ext1.ext2.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

示例文件: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 -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