Unix:查找文本文件中列出的目录文件名并移动到新目录

Unix:查找文本文件中列出的目录文件名并移动到新目录

我是一个命令行新手,试图找出适当的命令来在 Mac OS X 的终端中执行以下操作。

假设我已将所有文件放在同一目录中,我想隔离文本文件中列出的一组选定的目录文件并将其移动到新目录,我该如何:

  • 读取 .txt 文件中列出的选定文件名列表

  • 按文件名查找所有匹配项

  • 隔离所有文件匹配并将其移动到新目录

我发现这个命令可以在当前目录中查找(或两者)filestring.filetype 并将所有匹配项移动到新目录:

find . -type f -iname "filestring.filetype" -print0 |
  xargs -0 -J % mv % ~/NewDirectory/

我发现了这个tar命令,但是它创建了列出的每个文件名的存档副本filename.txt

tar -cf - -T filename.txt | (cd /path/to/new/dir && tar -xvf -)

任何帮助深表感谢!

以下解决方案由可信来源提供:

cat "filename.txt" | xargs -I % mv % ~/NewDirectory/

答案1

你可以试试这个。与 bash 一起使用。

while read file
do
    mv -v -i "$file" ~/NewDirectory/
done < listoffiles.txt

答案2

您建议的解决方案find ... xargs适用于我Bash version 3.2.48(1)-release在 Mac OS X 10.6.8 上使用的情况。

mkdir -v -p ~/NewDirectory
find . -type f -maxdepth 1 -iname "*.pdf" -print0 |
   xargs -0 -J % mv -i -v % ~/NewDirectory

如果要使用包含要移动的文件的完整路径的文本文件,请确保存储在文本文件中的每个文件路径均以空字节终止。这样,即使文件路径中的换行符将来也不会引起您的关注。

# some tests
mkdir -v -p ~/NewDirectory
find "${PWD}" -type f -maxdepth 1 -print0 > listoffiles.txt
xargs -0 -n 1 ls -l <listoffiles.txt
# use a grep regex filter on file paths
grep -az 'bash' listoffiles.txt | xargs -0 -n 1 ls -l  
xargs -0 -n 1 sh -c 'echo mv -v -i "$1" ~/NewDirectory' _ <listoffiles.txt
xargs -0 -J % ls -ld % ~/NewDirectory <listoffiles.txt
xargs -0 -J % mv -i -v % ~/NewDirectory <listoffiles.txt

要调试正在使用的代码Bash

#help set
set -Eeuxv -o pipefail +H   # for debugging
trap 'printf "%s\n" "$?"; trap - EXIT' EXIT HUP INT QUIT PIPE TERM ERR

相关内容