我有一个包含 400 多张图像的目录。他们中的大多数都是腐败的。我找出了好的。它们列在一个文本文件中(有 100 多个)。如何将它们一次性全部移动到 BASH 上的另一个目录?
答案1
我立即想到有几种方法可以做到这一点:
- 使用 while 循环
- 使用 xargs
- 使用rsync
假设文件名已列出(每行一个),files.txt
并且我们要将它们从子目录移动source/
到子目录target
。
while 循环可能看起来像这样:
while read filename; do mv source/${filename} target/; done < files.txt
xargs 命令可能如下所示:
cat files.txt | xargs -n 1 -d'\n' -I {} mv source/{} target/
rsync 命令可能如下所示:
rsync -av --remove-source-files --files-from=files.txt source/ target/
创建一个沙箱来试验和测试每种方法可能是值得的,例如:
# Create a sandbox directory
mkdir -p /tmp/sandbox
# Create file containing the list of filenames to be moved
for filename in file{001..100}.dat; do basename ${filename}; done >> /tmp/sandbox/files.txt
# Create a source directory (to move files from)
mkdir -p /tmp/sandbox/source
# Populate the source directory (with 100 empty files)
touch /tmp/sandbox/source/file{001..100}.dat
# Create a target directory (to move files to)
mkdir -p /tmp/sandbox/target
# Move the files from the source directory to the target directory
rsync -av --remove-source-files --files-from=/tmp/sandbox/files.txt /tmp/sandbox/source/ /tmp/sandbox/target/
答案2
快速地GNU 的解决方案parallel
:
让我们说“好的”图像文件名在 file 中列出good_img.txt
,目标文件夹名为good_images
。
cat good_img.txt | parallel -m -j0 --no-notice mv {} good_images
-m
- 在命令行长度允许的范围内插入尽可能多的参数。如果并行运行多个作业:在作业之间均匀分配参数-j N
- 职位数量。并行运行N
作业。0
意思是尽可能多。默认值为 100%,即每个 CPU 核心运行一个作业。
答案3
如果每一行只有一个文件名:
xargs -d \\n echo mv -t /target/directory
答案4
当您请求 bash 解决方案时,您可能真正指的是基于命令行的解决方案。其他的有假如用一个种类命令行工具。这是一个使用 bash 内置函数的解决方案(读取数组/映射文件)读取文本文件的内容,然后将这些文件名传递给命令mv
:
设置
$ touch {a..z}.jpg "bad one.jpg" "good one.jpg"
$ mkdir good
$ cat saveus
j.jpg
good one.jpg
z.jpg
准备
$ readarray -t < saveus.txt
$ declare -p MAPFILE
declare -a MAPFILE='([0]="j.jpg" [1]="good one.jpg" [2]="z.jpg")'
做吧
$ mv -- "${MAPFILE[@]}" good/
确认
$ ls -1 good/
good one.jpg
j.jpg
z.jpg
$ ls "good one.jpg" j.jpg z.jpg
ls: cannot access good one.jpg: No such file or directory
ls: cannot access j.jpg: No such file or directory
ls: cannot access z.jpg: No such file or directory