[英]Bash: Why mv won't move files under this for-loop?
使用Bash脚本,我想使用for循环而不是while循环(用于测试目的)移动文件列表。 谁能向我解释为什么mv总是充当文件重命名而不是在for循环下移动文件? 如何修复它以移动文件列表?
以下作品:
for file in "/Volumes/HDD1/001.jpg" "/Volumes/HDD1/002.jpg"
do
mv "$file" "/Volumes/HDD2/"
done
更新#1:
但是,假设我有一个sample_pathname.txt
cat sample_pathname.txt
"/Volumes/HDD1/001.jpg" "/Volumes/HDD1/002.jpg"
为什么下面的for循环不起作用呢?
array=$(cat sample_path2.txt)
for file in "${array[@]}"
do
mv "$file" "/Volumes/HDD2/"
done
谢谢。
系统:OS X
Bash版本:3.2.53(1)
cat sample_pathname.txt
"/Volumes/HDD1/001.jpg" "/Volumes/HDD1/002.jpg"
问题是这里的引号。 除非您需要使用带有换行符的文件名,否则执行此操作的简单和标准方法是每行列出一个文件名,且不带引号或其他元信息。
vbvntv$ cat sample_pathname_fixed.txt
/Volumes/HDD1/001.jpg
/Volumes/HDD1/002.jpg
vbvntv$ while read -r file; do
> mv "$file" "/Volumes/HDD2/"
> done <sample_pathname_fixed.txt
实际上,您甚至可以
xargs mv -t /Volumes/HDD2 <sample_pathname_fixed.txt
(某种程度上取决于您的xargs
死于大脑的方式)。
您的示例中使用的语法不会创建数组……它只是将文件内容存储在名为array的变量中。
IFS = $'\\ n'数组= $(cat sample_path2.txt)
如果您有一个包含文件名的文本文件(每个文件都在最简单的行上),则可以将其加载到数组中,并按照以下步骤对其进行迭代。 请注意,使用$(<file)作为cat和括号的更好替代方法,以将内容初始化为数组。 文件的每一行都对应一个索引。
array=($(< file_list.txt ))
for file in "${array[@]}"; do
mv "$file" "/absolute/path"
done
更新:如果文章顶部的命令不起作用,则可能未正确设置您的IFS。 我对其进行了更新以反映这一点。 另外,还有其他几种可靠的方法可以从文件初始化数组。 但是就像您提到的,如果只是将文件直接传递到while循环中,则可能不需要它。
这是Bash 4+中内置的shell,是mapfile的同义词。 如果可用,则效果很好。
readarray -t array < file
'read'命令还可以为您初始化一个数组:
IFS=$'\n' read -d '' -r -a array < file
用这个:
for file in "/Volumes/HDD1/001.jpg" "/Volumes/HDD1/002.jpg"
do
f=$(basename $file)
mv "$file" "/Volumes/HDD2/$f"
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.