我有一个目录,其中有许多子目录。所有这些子目录都包含每个都有唯一名称的文件。我想从所有子目录中取出所有文件并将它们全部移动到一个目录。
有几百个子目录,所以我不想手动执行此操作。我该如何编写 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 正常工作。