在多级路径内循环并重命名

在多级路径内循环并重命名

假设我有一个名为的文件list.txt包含路径到目录内的文件;

路径模式如下:

./path/to/file.txt
./path/to/another/file.txt
... etc

我想循环list.txt文件内部以获取文件的路径并使用更改其编码iconv

如果所有内容都在同一个目录中,我会这样做:

for i in `cat list.txt` ; do iconv -f windows-1256 -t utf8 $i > new_$i; done

问题我现在面临的是,由于它是多级路径,因此命名iconv打印的输出new_$i 在开始路径——我猜——这给了我错误:

No such file or directory

iconv那么,我怎样才能得到如下的输出:

./path/to/new_file.txt
./path/to/another/new_file.txt
... etc

答案1

如果你使用bashshell,那么你可以使用类似这样的命令:

while read name
do dir="${name%/*}" file="${name##*/}"
iconv -f windows-1256 -t utf8 "$dir/$file" -o "$dir/new_$file"
done  < list.txt

分配dirfile使用构造的行记录在手册页的Parameter expansion部分中。构造周围的引号用于处理文件名中的空格。EXPANSIONbash

如果您想在使用之前测试类似的东西,您可以echo在感兴趣的命令前面加上它(iconv在这个例子中),以确保该命令是您想要的。

相关内容