bash - 递归移动某种类型的文件并保持其目录结构

标签 bash shell command-line find grep

我有一个目录,其中包含多个带有 movjpg 文件的子目录。

/dir/
  /subdir-a/  # contains a-1.jpg, a-2.jpg, a-1.mov
  /subdir-b/  # contains b-1.mov
  /subdir-c/  # contains c-1.jpg
  /subdir-d/  # contains d-1.mov
  ...         # more directories with the same pattern

我需要找到一种使用命令行工具(最好是在 Mac OSX 上)将所有 mov 文件移动到新位置的方法。但是,一个要求是保持目录结构,即:

/dir/
  /subdir-a/  # contains a-1.mov
  /subdir-b/  # contains b-1.mov
              # NOTE: subdir-c isn't copied because it doesn't have mov files 
  /subdir-d/  # contains d-1.mov
  ...

我熟悉find, grep, and xargs但不确定如何解决这个问题。非常感谢您!

最佳答案

这在一定程度上取决于您的操作系统,更具体地说,取决于您的 tar 版本中的功能以及您是否有命令 cpio。这也有点取决于您的文件名中是否有换行符(特别是);大多数人不会。

选项#1

cd /old-dir
find . -name '*.mov' -print | cpio -pvdumB /new-dir

选项#2

find . -name '*.mov' -print | tar -c -f - -T - |
(cd /new-dir; tar -xf -)

cpio 命令有一个直通(复制)模式,在给定文件名列表(每行一个,在其标准输入上)的情况下,该模式完全符合您的要求。

某些版本的 tar 命令有一个选项可以从标准输入中读取文件名列表,每行一个;在 MacOS X 上,该选项是 -T -(其中单独的 - 表示“标准输入”)。对于第一个 tar 命令,选项 -f - 表示(在使用 -c 写入存档的上下文中,写入标准输出) ;在第二个 tar 命令中,-x 选项表示 -f - 表示“从标准输入读取”。

可能还有其他选择;仔细查看 tar 的手册页或帮助输出。

此过程复制文件而不是移动它们。操作的后半部分是:

find . -name '*.mov' -exec rm -f {} +

关于bash - 递归移动某种类型的文件并保持其目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798153/

相关文章:

bash - 使用 bash 脚本取消注释行

linux - 根据第一列按数字排序

linux - uniq -c 按列排序?

linux - Shell 中的 Perl glob 等效项用于循环匹配模式的文件

bash - 如何检查 mongodb 是否已启动并准备好接受来自 bash 脚本的连接?

git-filter-branch 删除字符串,但其中字符串包含 $ '\和其他字符

mysql - 使用命令行将SQL文件导入数据库时​​,使用了错误的MySQL用户

python - 分发 python 命令行工具的最佳方式是什么?

php - 从/var/www 文件夹运行 php 程序

windows - setx 使 Windows 资源管理器滚动到顶部