更改多个文件名 unix

Change multiple filenames unix

我不得不下载 15GB 的数据,由于某种原因,在下载过程中文件名被弄乱了,所以

test_file.txt

文件名加倍,所以是

test_file.txttest_file.txt

相反。我唯一的想法是,是否有任何方法可以计算字母数量,然后通过删除文件名的前半部分或后半部分来重命名每个文件?文件名不一致,例如在同一个文件夹中可能还有名为

的文件
files_are_great.txtfiles_are_great.txt

所以我正在努力寻找循环遍历它们的方法。

非常感谢!

使用 sed

sed 's#\(\.txt\)#& #g' 

说明:使用 \( \) 我们将可以使用 &

访问的表达式分组

演示:

echo "files_are_great.txtfiles_are_great.txt" | sed 's#\(\.txt\)#& #g' 
files_are_great.txt files_are_great.txt 

重命名:

for file_name in $(ls -1 *txt*txt)
do 
new_file_name=$(echo $i |sed 's#\(\.txt\)#& #g'  | cut -d' ' -f1)
mv $file_name $new_file_name 
done 

命令 sed 's/\(.*\)//' 将用单个字符串替换所有重复的字符串,而不需要文件名的特定部分,如 .txt。它允许字符串中有空格。

示例:

echo 'abc defabc def' | sed 's/^\(.*\)$//'

打印

abc def

sed命令的解释:

  • ^ 将模式锚定到行首
  • .* 是任意字符出现 0 次或多次
  • \(...\) 捕获与
  • 之间的模式相匹配的内容
  • </code> 是对第一个捕获组的引用,即之前找到的文本</li> <li><code>$ 将搜索模式锚定到行尾

这会导致搜索模式匹配整行,该整行由任何文本后跟相同的文本组成。

    替换中的
  • </code> 是对匹配文本的相同引用,即重复文本的一次出现。</li> </ul> <p>任何与模式不匹配的输入都将保持不变。</p> <p>假设你想重命名当前目录中的所有文件,你可以像这样使用它</p> <pre><code>for file in * do new=$(echo $file|sed 's/\(.*\)//') [ "$file" = "$new" ] || mv "$file" "$new" done

    由于 sed 命令不会更改不匹配的输入,对于不包含重复字符串的文件名,$new 将与 $file 相同。这将导致来自 mv 的错误消息。这就是为什么在这种情况下将跳过重命名。