Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 尝试使用两个txt文件重命名文件,但未得到正确的结果_Linux_Bash_Shell_Terminal - Fatal编程技术网

Linux 尝试使用两个txt文件重命名文件,但未得到正确的结果

Linux 尝试使用两个txt文件重命名文件,但未得到正确的结果,linux,bash,shell,terminal,Linux,Bash,Shell,Terminal,最近我试着写一个脚本,这样我就可以从两个txt文件中以正确的顺序重命名多个文件,它有点工作,但没有得到我想要的结果 如果有人知道这有什么问题,请告诉我 IFS=$'\n' for i in $(cat ../temp/files.txt); for j in $(cat ../temp/filenames.txt); do mv $i $j; done 同样,我们没有控制台,但似乎正在工作 for i in $(seq 1 `wc -l ../temp/files.txt|cut -f 1 -

最近我试着写一个脚本,这样我就可以从两个txt文件中以正确的顺序重命名多个文件,它有点工作,但没有得到我想要的结果

如果有人知道这有什么问题,请告诉我

IFS=$'\n'
for i in $(cat ../temp/files.txt); for j in $(cat ../temp/filenames.txt); do mv $i $j; done

同样,我们没有控制台,但似乎正在工作

for i in $(seq 1 `wc -l ../temp/files.txt|cut -f 1 -d" "`); do
    mv "`head -n $i ../temp/files.txt|tail -1`" "`head -n $i ../temp/filenames.txt|tail -1`"
done

同样,我们没有控制台,但似乎正在工作

for i in $(seq 1 `wc -l ../temp/files.txt|cut -f 1 -d" "`); do
    mv "`head -n $i ../temp/files.txt|tail -1`" "`head -n $i ../temp/filenames.txt|tail -1`"
done

假设两个文件的行数完全相同(每行代表一个文件名),并且文件名不包含新行或制表符,则快速脏bash解决方案(使用
粘贴
实用程序)可以是:

while IFS=$'\t' read -r from to; do
    echo mv "$from" "$to"
done < <(paste from.txt to.txt)
而IFS=$'\t'读取-r从到;做
回声mv“$从“$到”

完成<假设两个文件具有完全相同的行数(每行代表一个文件名),并且文件名不包含新行或制表符,则快速脏bash解决方案(使用
粘贴
实用程序)可以是:

while IFS=$'\t' read -r from to; do
    echo mv "$from" "$to"
done < <(paste from.txt to.txt)
而IFS=$'\t'读取-r从到;做
回声mv“$从“$到”

完成<您有并行文件,因此您希望在一个循环中同时读取两个文件,而不是嵌套循环。当你有嵌套的循环时,你将一次又一次地读取第二个文件,第一个文件中的每一行读取一次。从两个文件读取的单个循环将以锁定的方式通过它们

while IFS= read -u3 -r source && IFS= read -u4 -r target; do
    mv "$source" "$target"
done 3<../temp/files.txt 4<../temp/filenames.txt
而IFS=read-u3-r源和&IFS=read-u4-r目标;做
mv“$source”“$target”

done 3您有并行文件,因此您希望在一个循环中同时读取两个文件,而不是嵌套循环。当你有嵌套的循环时,你将一次又一次地读取第二个文件,第一个文件中的每一行读取一次。从两个文件读取的单个循环将以锁定的方式通过它们

while IFS= read -u3 -r source && IFS= read -u4 -r target; do
    mv "$source" "$target"
done 3<../temp/files.txt 4<../temp/filenames.txt
而IFS=read-u3-r源和&IFS=read-u4-r目标;做
mv“$source”“$target”

做得好3至少可以有带空格的文件,所以它不会工作,您需要使用
“$i”
“$j”
。甚至比它还不起作用,因为将在每个
i
中循环。知道如何解决这个问题吗?是的,我附近没有控制台。但是我建议
对于从1到“源文件行数”的I,要比
mv`head-n$I“src_filename”| tail-1``head-n$I“dst_filename”| tail-1``更有效,所以在文件中使用循环编号并使用$I作为行号将每个文件读入数组,然后遍历数组索引。至少可以有带空格的文件,所以它不会工作,您需要使用
“$i”
“$j”
。甚至比它还不起作用,因为将在每个
i
中循环。知道如何解决这个问题吗?是的,我附近没有控制台。但我建议
对于从1到“源文件行数”的I,比
mv`head-n$I“src_filename”| tail-1``head-n$I“dst_filename”| tail-1``更有效,因此,可以使用循环编号,并在文件中使用$I作为行号将每个文件读入一个数组,然后遍历数组索引。确保在工作机器上运行之前进行备份。确保在工作机器上运行之前进行备份。