如何将文本文件中指定的文件移动到 BASH 上的另一个目录?

如何将文本文件中指定的文件移动到 BASH 上的另一个目录?

我有一个包含 400 多张图像的目录。他们中的大多数都是腐败的。我找出了好的。它们列在一个文本文件中(有 100 多个)。如何将它们一次性全部移动到 BASH 上的另一个目录?

答案1

我立即想到有几种方法可以做到这一点:

  1. 使用 while 循环
  2. 使用 xargs
  3. 使用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

相关内容