所以我有一个文件夹,其中包含如下文件的名称:
01 02 03 04 05 ...
我想要做的是创建一个bash脚本,该脚本查找同一文件夹中的另一个文档(即names.txt),并根据文本文档分配文件名。所以,如果' names.txt'看起来像这样:
name1 name2 name3 ...
我想要一个可以分配' name1'到当前名为' 01'的文件在文件夹中。
我对bash脚本仍然很陌生,所以任何帮助都会受到赞赏。如果需要澄清某些问题,我愿意接受问题。
答案 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
对于包含当前目录中数字的每个文件$f
,grep
命令在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