如何压缩子目录

如何压缩子目录

我有一个目录,其中有许多子目录。所有这些子目录都包含每个都有唯一名称的文件。我想从所有子目录中取出所有文件并将它们全部移动到一个目录。

有几百个子目录,所以我不想手动执行此操作。我该如何编写 shell 脚本来做到这一点?我正在使用 bash。

答案1

find是解决方案:

find /srcpath -type f -exec mv {} /dstpath \;

或者更好,如果您mv-t destination-dir选择:

find /srcpath -type f -exec mv -t /dstpath {} +

答案2

简单的方法,如果有单级子目录:

cd source_directory
mv -- */* /path/to/target/directory

如果要将文件移动到父目录,那就是mv -- */* ..请注意,名称以.(“点文件”)开头的文件或目录被排除。要在 bash 中包含它们,请先运行shopt -s dotglob。在 zsh 中,setopt glob_dots首先运行。

如果您还想递归地从子子目录等移动文件,请使用zsh

cd source_directory
mv -- */**/*(^/) .

如果您尝试运行该mv命令并收到“命令行太长”之类的错误,则必须将其分解。最简单的方法是使用find.使用 GNU 工具(非嵌入式 Linux 和 Cygwin):

find source_directory -mindepth 2 ! -type d \
  -exec mv -t /path/to/target/directory -- {} +

答案3

#! /bin/sh

# set your output directory here
outdir=./Outdir 

# get a list of all the files (-type f)
# in subdirectories (-mindepth 1)
# who do not match the outdir  (-path $outdir -prune)
# and step through and execute a move
find . -mindepth 1 -path $outdir -prune -o -type f -exec mv '{}' $outdir \;

这将允许您从当前工作目录、所有子目录中搜索,并将文件移动到同一工作目录 ($outdir) 中的子目录 - 请注意路径上的 ./ 以使 -prune 正常工作。

相关内容