我有两个按数字排序的文件。我需要帮助shell脚本来读取这两个文件并执行1:1映射并使用映射的case重命名文件名#;
例如:
cat case.txt
10_80
10_90
cat files.txt
A BCD_x 1.pdf
A BCD_x 2.pdf
ls pdf_dir
A BCD_x 1.pdf A BCD_x 2.pdf
阅读这些2 txt并重命名pdf_dir中的pdf文件:
A BCD_x 1.pdf as A BCD_10_80.pdf
A BCD_x 1.pdf as A BCD_10_90.pdf
答案 0 :(得分:2)
使用paste
创建“映射”,然后使用shell工具进行重命名。
shopt -s extglob
while IFS=$'\t' read file replacement; do
echo mv "$file" "${file/x +([0-9])/$replacement}"
done < <(paste files.txt case.txt)
当你满意时删除“echo”。
答案 1 :(得分:1)
使用awk:
awk 'FNR==NR{a[FNR]=$0;next}
{f=$0; sub(/_x /, "_" a[FNR] " "); system("mv \"" f "\" \"" $0 "\"")}' case.txt files.txt
答案 2 :(得分:1)
使用普通数组和sed替换 - 在mv之前删除echo将为您提供移动功能。 您可以将/ path /更改为/ pdf_dir /以指定所需目录的路径
#!/bin/bash
i=0
while read line
do
arr[i]="$line"
((i=i+1));
done < files.txt
i=0
while read case
do
newFile=$(echo "${arr[i]}" | sed "s/x/"$case"/")
echo mv /path/to/pdf_dir/"${arr[i]}" /path/to/pdf_dir/"$newFile"
((i=i+1))
done < case.txt
答案 3 :(得分:0)
如果你有Bash 4.0,这可能会有所帮助:
#!/bin/bash
declare -A MAP
I=0
IFS=''
while read -r CASE; do
(( ++I ))
MAP["A BCD_x ${I}.pdf"]="A BCD_${CASE}.pdf"
done < case.txt
while read -r FILE; do
__=${MAP[$FILE]}
[[ -n $__ ]] && echo mv "$FILE" "$__" ## Remove echo when things seem right already.
done < files.txt
注意:确保以UNIX文件格式运行脚本。