Bash:循环遍历文本文件中列出的文件并移动它们

时间:2011-07-04 01:30:31

标签: macos bash file for-loop move

我有一个目录(目录A),里面有10,000个文件。我想将其中一些移动到目录B,其他移动到目录C.我创建了一个文本文件,其中包含我要移动到目录B的所有文件的名称,另一个文件包含我想要的所有文件的名称移动到目录C.如何编写bash for循环以将这些文件移动到新目录。

伪代码:

用于textfileB中的文件:
   将文件从目录A移动到目录B

for textfileC中的文件:
   将文件从目录A移动到目录C

很抱歉,如果在其他地方询问这个问题,但我花了好几个小时试图学习bash而我却没有得到它。我无法在另一个我能理解的帖子中找到类似的东西(也许我只是不知道正确的搜索词)。

我得到了类似的东西,但我无法正常工作:

FILES=[dont' know what goes here? An array? A list?  

我可以只说明文本文件名,如果是,那么文件必须是什么格式? name1.ext,name2.ext或name1.ext name2.ext]

for f in $FILES; do mv $f /B/$f [not sure about the second argument for mv]; done

THX

顺便说一句 Mac OSX 10.6.8(雪豹) Apple Terminal v.2.1.2 / 273.1 Bash 3.2

6 个答案:

答案 0 :(得分:19)

cat file-list.txt | while read i; do
   # TODO: your "mv" command here.  "$i" will be a line from
   # the text file.
done

答案 1 :(得分:3)

BASH FAQ entry #1: "How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?"

如果文件名保持不变,则mv的第二个参数可以只是目录。

答案 2 :(得分:1)

脚本的目录应该是您的文件位置

TO_B=file1.txt
TO_C=file2.txt

for file in $TO_B
do
mv ${file} B/
done

for file in $TO_C
do
mv ${file} C/
done

答案 3 :(得分:1)

你可以移动1000或1000个用户目录,而不需要花费很多时间来存在数千个用户目录。

cat deleteduser | while read i;  do mv -vv $i ../deleted_user; done; 
deleteuser= user name list
../deleted_user= destination dir

答案 4 :(得分:0)

你必须使用BASH吗? Perl或Kornshell怎么样?这里的问题是Bash没有散列键控数组(Kornshell和Perl do)。这意味着没有简单的方法来跟踪哪些文件在哪里。想象一下Perl:

my %directoryB;   #Hash that contains files to move to Directory B
my %directoryC;   #Hash that contains files to move to Directory C

open (TEXT_FILE_B, "textFileB") or die qq(Can't open "textFileB");
while (my $line = <TEXT_FILE_B>) {
    chomp $line;
    $directoryB{$line} = 1;
}
close TEXT_FILE_B;

open (TEXT_FILE_C, "textFileC") or die qq(Can't open "textFileC");
while (my $line = <TEXT_FILE_C>) {
    chomp $line;
    $directoryC{$line} = 1;
}
close TEXT_FILE_C;

以上几行创建了两个哈希值。一个用于需要移动到目录B的文件,另一个用于需要移动到目录C的文件。现在,我所要做的就是查看我的哈希并决定:

foreach my $file (@directory) { #A little cheating here...
   if (exists $directoryB{$file}) {
       move ($file, $directoryB);
   } elsif (exists $directoryC{$file}) {
       move ($file, $directoryC)
}

我的if语句现在可以查看是否已在该哈希中定义了一个键。如果有,我知道该文件可以移动到该目录中。我只需要阅读两个文本文件一次。之后,我的两个哈希将存储哪些文件移动到一个目录,哪个文件移动到另一个目录。


但是,我们没有哈希值,因此我们将使用grep来查看文件名是否在目录中。我假设你每行都有一个文件名。

ls | while read file
do
   if grep -q "^${file}$" textFileB
   then
       mv $file $directoryB
   elif grep -q "^${file}$" textFileC
   then
       mv $file $directoryC
   fi
done

grep -q将搜索您的两个文本文件,以查看匹配的文件是否存在。如果是,它会将文件移动到该目录。它不是非常有效,因为它必须每次都搜索整个文本文件。但是,它非常有效,而你只谈论10,000个文件,所以整个操作只需要几分钟。

答案 5 :(得分:0)

使用bash,有一个巨大的文件列表,其中包含我建议的带有前导和/或结尾空格的字符串:

less 'file-list.txt' | while read -r; do mv "$REPLY" /Volumes/hard_drive_name/new_destination_directory_name; done

请参阅: