我需要将 TXT 文件中列出的所有文件从一个位置复制到另一个位置。
/1132526906_tt_nad87_1.jpg /thumb/t1132526906_tt_nad87_1.jpg
/1132526906_tt_nad87_10.jpg /thumb/t1132526906_tt_nad87_10.jpg
/1132526906_tt_nad87_11.jpg /thumb/t1132526906_tt_nad87_11.jpg
/1132526907_tt_nad87_12.jpg /thumb/t1132526907_tt_nad87_12.jpg
/1132526907_tt_nad87_13.jpg /thumb/t1132526907_tt_nad87_13.jpg
/1132526908_tt_nad87_14.jpg /thumb/t1132526908_tt_nad87_14.jpg
我可以创建一个 CSV 文件并使用一些可用的字符source
进行划分。target
例子
我想复制文件1132526906_tt_nad87_1.jpg
从./
到/thumb/t1132526906_tt_nad87_1.jpg
- 重命名并移动。
问题
有一些命令行命令可以做到这一点吗?我找到了示例,但这些示例仅进行复制(不重命名)。
更新
我创建了这个脚本:
#!/bin/bash
input="/data/web/web/gallery/data.csv"
while IFS=',' read from to
do
echo "from: $from, to: $to"
done < "$input"
但没有任何行被“回显”,似乎data.csv
文件没有被读取。有什么不对?
答案1
从OP的示例来看,重命名和更改似乎相当一致,例如filename.jpg
似乎总是以相同的路径加上“t”作为前缀thumb/tfilename.jpg
。如果是这种情况,那么可以做一些更简单的事情。
如果全部都发往“thumb/”目录。
当前目录中有测试文件 abc.jpg、xyz.jpg。
这是示例文件列表
$ cat testfile
abc.jpg
xyz.jpg
测试
使用 echo 来执行命令的测试版本会很有帮助,以查看代码将执行的操作:
$ while read my_file; do
echo cp -a "$my_file" "thumb/t$my_file"
done < testfile
测试结果:
cp -a abc.jpg thumb/tabc.jpg
cp -a xyz.jpg thumb/txyz.jpg
while read my_file; do ... done
语法将逐行处理 stdin< testfile
用于<
重定向testfile
到标准输入,因此 while 语句读取它my_file
是我们为保存输入而创建的变量,正如我们在代码正文中看到的那样,可以使用$my_file
cp
如果文件名包含空格或其他奇怪的字符,这些字符可能会破坏命令用于识别参数的空格,请使用引号以避免潜在的问题
最终的
如果对测试回显结果满意,我们可以删除回显以实际执行命令:
$ while read my_file; do
cp -a "$my_file" "thumb/t$my_file"
done < testfile
当您检查thumb/
目录时,您将看到复制到那里的两个测试文件。
最终结果,有反馈
默认情况下cp
,除非有错误,否则不提供反馈。因此,如果您要复制数百或数千个文件,则可能看起来好像什么也没发生。要查看反馈,请使用详细选项-v
:
$ while read my_file; do
cp -av "$my_file" "thumb/t$my_file"
done < testfile
结果:
`abc.jpg' -> `thumb/tabc.jpg'
`xyz.jpg' -> `thumb/txyz.jpg'
答案2
最简单的是xargs
:
< file-list.txt xargs -n2 cp -v