【问题标题】:Change multiple filenames unix更改多个文件名 unix
【发布时间】:2020-06-28 03:45:21
【问题描述】:

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

test_file.txt

文件名加倍,所以是

test_file.txttest_file.txt

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

files_are_great.txtfiles_are_great.txt

所以我正在努力寻找一种方法来遍历它们。

非常感谢!

【问题讨论】:

    标签: unix rename filenames


    【解决方案1】:

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

    例子:

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

    打印

    abc def
    

    sed 命令解释:

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

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

    • 替换中的\1 是对匹配文本的相同引用,即重复文本的一次出现。

    任何与模式不匹配的输入都将保持不变。

    假设你想重命名当前目录中的所有文件,你可以像这样使用它

    for file in *
    do
        new=$(echo $file|sed 's/\(.*\)\1/\1/')
        [ "$file" = "$new" ] || mv "$file" "$new"
    done
    

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

    【讨论】:

      【解决方案2】:

      使用 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 
      

      【讨论】:

      • 嗨!谢谢,演示工作得很好。我制作了一些随机的 ascii 文件,当我尝试你的 foor 循环时,我收到错误“剪切:分隔符必须是单个字符”,然后是 mv:在 files_are_great.txtfiles_are_great.txt 之后缺少目标文件操作数?
      • @sciprtgirl_3000 我已经更新了代码。请立即检查。应该是cut -d' ' -f1 我错过了引号。
      • 此解决方案仅适用于不包含空格的文件名*.txt。而不是插入空格然后使用cut 来获取第一个字段,您可以使用sed 删除.txt 之后的部分`
      • 例如将.txt之后的部分截掉:sed 's/\(\.txt\).*/\1/'。而不是for file_name in $(ls -1 *txt*txt) 使用for file_name in *txt*txt
      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 2013-10-06
      • 2023-03-09
      • 2011-10-16
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多