我想将递归文件复制到其父文件夹以获取特定的文件扩展名。例如:
./folderA/folder1/*.txt to ./folderA/*.txt
./folderB/folder2/*.txt to ./folderB/*.txt
等
我检查了cp
和find
命令,但无法使其正常工作。
答案 0 :(得分:4)
我怀疑,当你说 copy 时,你实际上是指将文件移动到各自的父目录。可以使用find
:
$ find . -name '*.txt' -type f -execdir mv -n '{}' ../ \;
上面的命令会递归到当前目录.
,然后将以下级联条件应用于找到的每个项目:
-name '*.txt'
只过滤掉.txt
扩展名-type f
将仅过滤掉常规文件(例如,不是出于任何原因的目录,其名称恰好以.txt
结尾)-execdir mv -n '{}' ../ \;
在包含目录中执行命令mv -n '{}' ../
,其中{}
是匹配文件名称的占位符,需要单引号才能停止解释花括号的shell。 ;
终止命令,并且必须再次从shell解析它。我已将-n
标记传递给mv
程序,以避免意外覆盖现有文件。
以上命令将转换以下文件系统树
dir1/
dir11/
file3.txt
file4.txt
dir12/
file2.txt
dir2/
dir21/
file6.dat
dir22/
dir221/
dir221/file8.txt
file7.txt
file5.txt
dir3/
file9.dat
file1.txt
进入这一个:
dir1/
dir11/
dir12/
file3.txt
file4.txt
dir2/
dir21/
file6.dat
dir22/
dir221/
file8.txt
file7.txt
dir3/
file9.dat
file2.txt
file5.txt
要删除空目录,请运行
$ find . -type d -empty -delete
同样,此命令将遍历当前目录.
,然后应用以下内容:
-type d
这次只筛选出目录-empty
仅过滤掉那些空的-delete
删除它们。 精细打印: -execdir
未指定POSIX,但主要实现(至少GNU和BSD)支持它。如果您需要严格的POSIX合规性,则必须使用安全性较低的-exec
,在这种情况下需要额外考虑正确使用。
最后,请在测试目录中尝试使用虚拟文件而不是实际数据的命令。特别是使用-delete
的{{1}}选项,您可以比您的成像速度更快地丢失所有数据。阅读the man page,如果还不够,请find
find
。如果您不理解,请不要盲目地复制互联网上发布的随机陌生人的shell命令。
答案 1 :(得分:1)
$cp ./folderA/folder1/*.txt ./folderA
尝试此命令
答案 2 :(得分:0)
从root(ish)目录运行类似的东西:
#! /bin/bash
BASE_DIR=./
new_dir() {
LOC_DIR=`pwd`
for i in "${LOC_DIR}"/*; do
[[ -f "${i}" ]] && cp "${i}" ../
[[ -d "${i}" ]] && cd "${i}" && new_dir
cd ..
done
return 0
}
new_dir
这将搜索每个目录。遇到文件时,会将文件复制到目录中。找到目录后,它将向下移动到目录中并再次启动该过程。我认为这对你有用。
祝你好运。