【问题标题】:Bash: Get filenames from names.txt and assign it to files in a folderBash:从 names.txt 获取文件名并将其分配给文件夹中的文件
【发布时间】:2016-08-21 00:31:22
【问题描述】:

所以我有一个文件夹,文件名如下:

01 02 03 04 05 ...

我想做的是创建一个 bash 脚本,该脚本在同一文件夹中的另一个文档(即 names.txt)中查找,并根据文本文档分配文件名。因此,如果“names.txt”看起来像这样:

名称1 名称2 名称3 ...

我想要一个 bash 脚本,它可以将“name1”分配给文件夹中当前名为“01”的文件。

我对 bash 脚本还是很陌生,因此我们将不胜感激。如果需要澄清一些问题,我愿意提出问题。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以使用paste 来对齐 ls (stdin) 和名称文件(在本例中来自父目录),然后使用 while 循环逐行读取结果,遍历列表并执行您的事情:

    ls ?? | sort -n | paste - ../names.txt | while read a b; do mv "$a" "$b"; done
    

    这假定文件名没有特殊字符,并且数字正是名称文件中的计数。

    【讨论】:

    • 感谢您的回复,但是当我这样做时,它只是说“mv:无法统计'name1':没有这样的文件或目录”知道为什么会这样吗?
    • 是的,名称和减号在粘贴时顺序错误,现已修复。
    • 几乎可以工作了。就像我尝试的另一个解决方案一样,它在行尾添加了一个“/r”,使 bash 认为它必须将文件移动到子目录。你可以在这里看到它:i.imgur.com/zQIErJ4.png
    • 您需要先将names.txt文件转换为unix文件结尾。
    • 非常感谢,我不知道 windows 和 unix 文件结尾之间存在差异。很多东西要学! :)
    【解决方案2】:

    试试这个脚本 注意:在测试之前备份您的文件夹。

        #!/bin/bash
        ls -I names.txt -I rename.txt -I *.sh > rename.txt
        paste rename.txt names.txt | column -s $'\t' -t > rename_rules.txt
        eval "$(sed 's/^/mv /g' rename_rules.txt )"
        #rm rename.txt rename_rules.txt
    

    这对我有用。请找到以下所有步骤。

    $ touch 01 02 03 04 05
    
    $ vim names.txt
    
    $ cat names.txt
    name1
    name2
    name3
    name4
    name5
    
    $ ls
    01  02  03  04  05  main.sh  names.txt
    
    $ cat main.sh 
    #!/bin/bash
    ls -I names.txt -I rename.txt -I *.sh > rename.txt
    paste rename.txt names.txt | column -s $'\t' -t > rename_rules.txt
    eval "$(sed 's/^/mv /g' rename_rules.txt )"
    exit 0;
    #rm rename.txt rename_rules.txt
    
    $ sh main.sh
    
    $ ls
    main.sh  name1  name2  name3  name4  name5  names.txt  rename.txt rename_rules.txt
    
    $ cat rename_rules.txt
    01  name1
    02  name2 
    03  name3
    04  name4
    05  name5  
    

    您能否分享您的实际文件名和 names.txt 内容以便我们进行调试?

    【讨论】:

    • 您的解决方案几乎是完美的。唯一错误的是,由于某种原因,当到达 eval 命令时,它在末尾添加了一个“/r”,使得 bash 必须移动名为“name1/r”的文件,这导致它说“无法移动到自身的子目录。”。有什么解决办法吗?
    【解决方案3】:

    试试这个:

    for f in [0-9]*; do
      grep -q name"${f#0}" names.txt && mv "$f" name"${f#0}"
    done
    

    对于当前目录中包含数字的每个文件$fgrep 命令在names.txt 中搜索字符串name,后跟$f 的值,没有潜在的前导零:"${f#0}"

    如果找到该字符串,mv 命令将使用所需名称重命名文件。

    【讨论】:

      【解决方案4】:

      这是解决方案的安全版本 - 假设要重命名的文件位于 srcdir - 它在新的 destdir 目录中创建重命名的文件 - 删除实际副本的回显 - 您可以在验证正确的重命名后将 cp 更改为 mv

      mkdir destdir
      ls srcdir|paste - names.txt|
      while read srcf destf; do
         echo cp srcdir/$srcf destdir/$destf
      done
      

      【讨论】:

        猜你喜欢
        • 2016-11-15
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多