Bash:从names.txt获取文件名并将其分配给文件夹中的文件

时间:2016-08-20 07:56:53

标签: bash

所以我有一个文件夹,其中包含如下文件的名称:

01
02
03
04
05
...

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

name1
name2
name3
...

我想要一个可以分配' name1'到当前名为' 01'的文件在文件夹中。

我对bash脚本仍然很陌生,所以任何帮助都会受到赞赏。如果需要澄清某些问题,我愿意接受问题。

4 个答案:

答案 0 :(得分:1)

您可以使用paste来ll up(stdin)和名称文件(在这种情况下来自父目录),然后使用while循环迭代读取结果,在列表上逐行读取结果做你的事:

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

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

答案 1 :(得分:1)

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

    #!/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内容,以便我们可以调试吗?

答案 2 :(得分:0)

试试这个:

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命令将使用所需名称重命名该文件。

答案 3 :(得分:0)

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

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