如果后缀来自文本文件中的列表,有没有办法给文件添加后缀



因此,目前搜索正在产生一个单词重命名解决方案,在该解决方案中,您可以在代码中定义(静态(后缀。我需要根据基于文本的文件列表进行重命名,因此-

我在/home/linux/test/:中有一个文件列表

1000.ext
1001.ext
1002.ext
1003.ext
1004.ext

然后我有一个txt文件(labels.txt(,其中包含我想要使用的标签:

Alpha
Beta
Charlie
Delta
Echo

我想重命名文件,使其看起来像(示例1(:

1000 - Alpha.ext
1001 - Beta.ext
1002 - Charlie.ext
1003 - Delta.ext
1004 - Echo.ext

如何将/home/linux/test/中的所有文件重命名为示例1中的列表的脚本?

使用paste并行循环两个列表。将文件名拆分为前缀和扩展名,然后将所有内容组合为新文件名。

dir=/home/linux/test
for file in "$dir"/*.ext
do
read -r label
prefix=${file%.*} # remove everything from last .
ext=${file##*.}   # remove everything before last .
mv "$file" "$prefix - $label.$ext"
done < labels.txt

我最初部分弄错了请求,尽管这一步仍然很有用,因为它为您提供了所需的文件名。

#!/bin/sh
count=1000
cp labels.txt stack
cat > ed1 <<EOF
1p
q
EOF
cat > ed2 <<EOF
1d
wq
EOF
next () {
[ -s stack ] && main
}
main () {
line="$(ed -s stack < ed1)"
echo "${count} - ${line}.ext" >> newfile
ed -s stack < ed2
count=$(($count+1))
next
}
next

现在我们只需要移动文件:-

cp newfile stack
for i in *.ext
do
newname="$(ed -s stack < ed1)"
mv -v "${i}" "${newname}"
ed -s stack < ed2
done
rm -v ./ed1
rm -v ./ed2
rm -v ./stack
rm -v ./newfile

关于文件数量与标签数量不完全相同的可能性,我将其设置为伪并行循环几个数组。

$: cat script
#!/bin/env bash
lst=( *.ext )                  # array of files to rename
mapfile -t labels < labels.txt # array of labels to attach
for ndx in ${!lst[@]}          # for each filename's numeric index 
do # assign the new name
new="${lst[ndx]/.ext/ - ${labels[ndx%${#labels[@]}]}.ext}"
# show the command to rename the file
echo "mv "${lst[ndx]}" "$new"" 
done
$: ls -1 *ext # I added an extra file
1000.ext
1001.ext
1002.ext
1003.ext
1004.ext
1005.ext
$: ./script # loops back if more files than labels
mv "1000.ext" "1000 - Alpha.ext"
mv "1001.ext" "1001 - Beta.ext"
mv "1002.ext" "1002 - Charlie.ext"
mv "1003.ext" "1003 - Delta.ext"
mv "1004.ext" "1004 - Echo.ext"
mv "1005.ext" "1005 - Alpha.ext"
$: ./script > do # use ./script to write ./do
$: ./do          # use ./do to change the names
$: ls -1
'1000 - Alpha.ext'
'1001 - Beta.ext'
'1002 - Charlie.ext'
'1003 - Delta.ext'
'1004 - Echo.ext'
'1005 - Alpha.ext'
do
labels.txt
script

您可以删除echo,让./script重命名那里的文件
我将labels重命名为labels.txt以匹配您的示例。

如果您不使用bash,则需要调用类似sedawk的内容。下面是一个基于awk的简短脚本,它也将执行同样的操作。

$: cat script2
#!/bin/env sh
printf "%sn" *.ext > files.txt
awk 'NR==FNR{label[i++]=$0}
NR>FNR{ if (! label[i] ) { i=0 } cmd="mv ""$0"" ""gensub(/[.]ext/, " - "label[i++]".ext", 1)""";
print cmd;
# system(cmd);
}' labels.txt files.txt

取消对system行的注释,使其实际也进行重命名
确实假设您的文件名没有嵌入换行符。如果有问题,请告诉我们。

最新更新