我有一个目录(目录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
答案 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)
如果文件名保持不变,则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
请参阅: