Macos Bash:在文本文件中列出的文件上循环并移动它们

Macos Bash:在文本文件中列出的文件上循环并移动它们,macos,bash,file,for-loop,move,Macos,Bash,File,For Loop,Move,我有一个目录(目录a),里面有10000个文件。我想将其中一些移动到目录B,另一些移动到目录C。我创建了一个文本文件,其中包含我要移动到目录B的所有文件的名称,另一个包含我要移动到目录C的所有文件的名称。如何编写bash for循环将这些文件移动到新目录 伪代码: 对于textfileB中的文件: 将文件从目录A移到目录B 对于textfileC中的文件: 将文件从目录A移到目录C 很抱歉,如果在其他地方问这个问题,但我花了几个小时试图学习bash,我就是不明白。我无法在另一个我能理解的帖子中找

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

伪代码:

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

对于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(雪豹) 苹果终端v。2.1.2 / 273.1 Bash 3.2


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

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

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

你必须使用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;
我的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
将搜索您的两个文本文件,查看是否存在匹配的文件。如果是,它会将文件移动到该目录。它不是很有效,因为它每次都要搜索整个文本文件。但是,它非常高效,而且您只需要谈论10000个文件,因此整个操作只需几分钟。

您可以移动1000个或1000个用户目录,而无需在存在数千个用户目录的地方花费太多时间

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

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

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


“…列在文本文件中…”是否缺少
$(cat$TO_B)
?@sarnold使用
表示i in$(cat$TO_B)
将无法正确处理带空格的文件名。这就是我喜欢我的答案的一个原因,
cat filename | while read I
。BASH常见问题解答非常棒。再次感谢您确保这里有大量链接。:)谢谢这起作用了。对于其他人,这里是完整的命令,我作为一行输入:cat list_of_files_with.txt | while read I;执行mv$i/卷/硬盘驱动器名称/新目的地目录名称;done@AquaT33nFan-我会将
“$I”
放在引号中,这样您就可以处理带有空格和其他字符的文件名,而这些字符通常不会出现在命令行中。祝贺您,您刚刚收到@Fredrik-如果它增加了可读性,它真的没用吗?我发现像
(读的时候我;做什么;做什么)
这样的东西是“向后”读的。另外,额外的上下文切换和加载
cat
二进制文件将非常便宜,因为您不会注意到当前硬件上的差异。@asveikau-“无用”在这里可能是一个太强的词,但我认为您评论中的方法优于
cat…|方法。既然*NIX是一个非常漂亮的操作系统,你就不想浪费进程了,是吗?;-)
less 'file-list.txt' | while read -r; do mv "$REPLY" /Volumes/hard_drive_name/new_destination_directory_name; done