繁体   English   中英

Bash:为什么mv不会在此for循环下移动文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM