Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
在Linux中更改多个文件的名称_Linux_File Rename - Fatal编程技术网

在Linux中更改多个文件的名称

在Linux中更改多个文件的名称,linux,file-rename,Linux,File Rename,在ubuntu机器上,我有许多文件名为a1.txt、b1.txt、c1、txt…的文件 是否有任何快速方法将所有文件名更改为a2.txt、b2.txt、c2.txt 特别是,我想替换名称字符串的一部分。例如,每个文件名都包含一个名为“apple”的字符串,我想在所有文件名中用“pear”替换“apple” 任何命令或脚本?无需任何额外软件,您可以: for FILE in *1.txt; do mv "$FILE" $(echo "$FILE" | sed 's/1/2/'); done 以下

在ubuntu机器上,我有许多文件名为a1.txt、b1.txt、c1、txt…的文件

是否有任何快速方法将所有文件名更改为a2.txt、b2.txt、c2.txt

特别是,我想替换名称字符串的一部分。例如,每个文件名都包含一个名为“apple”的字符串,我想在所有文件名中用“pear”替换“apple”


任何命令或脚本?

无需任何额外软件,您可以:

for FILE in *1.txt; do mv "$FILE" $(echo "$FILE" | sed 's/1/2/'); done

以下命令将重命名指定的文件,方法是将其名称中第一个出现的
1
替换为
2

rename 1 2 *1.txt

像这样的方法应该会奏效:

for i in *1.txt; do
    name=$(echo $i | cut -b1)
    mv $i ${name}2.txt
done
修改以满足您的需要

for f in {a..c}1.txt; do echo "$f" "${f/1/2}"; done
如果输出看起来正确,则将“echo”替换为“mv”

我想用“linux”取代“apple”


第1行中的花括号至少应该与bash一起使用

对于不同子目录中的文件,这里有另一个适用于我的选项(遵循上面的示例)

for FILE in $(find . -name *1.txt); do mv "$FILE" "${FILE/1/2}"; done;

不要在脚本中解析ls的输出。它很容易受到文件名中各种特殊字符的攻击,首先是:空格、制表符、*和?@user-这通常是一个很好的建议,这就是为什么我不会在脚本中嵌入上述代码。在CentOS 5上非常适合我。啊!linux上有一个
重命名
/usr/bin/prename:a/usr/bin/perl-w脚本文本可执行文件
,其工作方式不同。我会撤销我的否决票,但它是锁定的,只要帖子没有被编辑。@River:什么对你不起作用?在哪个壳里?{a..c}在bash中工作。首先,我认为用pear替换linux将是更明显的解决方案,因为OP中的示例是“apple”->“pear”,而pear显然是其意图,而linux是复制/粘贴的残余。第二,您的第二个命令需要将
done
附加到末尾,否则它会提示您输入该命令。第三,虽然花括号可以工作,但我发现
*
通配符运算符更广泛地适用(这是本文的重点),也更直观。(第三点更像是一种观点,您在第二个示例中确实使用了
*
,因此如果您将第一个命令保持原样,我就可以了。)您的想法是
首先回送文件,以确保在实际操作之前正确输出(Linux可以不允许出现小的打字错误)使这个答案比我所认为的被接受的答案要好一点,但我觉得我不能支持它,除非它1:做它声称要做的事情(linux/pear在您最初的答案中混淆了),2:当复制/粘贴为命令时立即工作(这需要
done
来做)@River:{a..c}1.txt是比*1.txt更窄的解决方案。如果读者理解它,它很容易被采用到m、n或z的范围,而*1.txt是一个非常粗糙的匹配。我很抱歉监督“完成”。这是我的错,如果不是在从“正确”到“正确”的任意变化中丢失的话,我会认识到这一点的。我想,从苹果到linux,而不是从苹果到梨子的幽默变化,大多数读者都会立即理解。用sed's/1/2/g替换sed's/1/2/'
for f in *apple*; do mv "$f" "${f/apple/linux}"; done
for FILE in $(find . -name *1.txt); do mv "$FILE" "${FILE/1/2}"; done;