gpt4 book ai didi

Linux递归复制文件到其父文件夹

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:28 28 4
gpt4 key购买 nike

我想将文件递归复制到其父文件夹以获得特定的文件扩展名。例如:

./folderA/folder1/*.txt to ./folderA/*.txt  
./folderB/folder2/*.txt to ./folderB/*.txt

等等

我检查了 cpfind 命令,但无法正常工作。

最佳答案

我怀疑当您说复制时,您实际上是想将文件移动到它们各自的父目录。可以使用 find 轻松完成:

$ find . -name '*.txt' -type f -execdir mv -n '{}' ../ \;

上述命令递归到当前目录 .,然后将以下条件级联应用于找到的每个项目:

  1. -name '*.txt' 将仅过滤掉具有 .txt 扩展名的文件
  2. -type f 将仅过滤掉常规文件(例如,不过滤掉名称恰好以 .txt 结尾的目录 - 无论出于何种原因)
  3. -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

同样,此命令将遍历当前目录 .,然后应用以下内容:

  1. -type d 这次只过滤掉目录
  2. -empty 只过滤掉那些为空的
  3. -delete 删除它们。

细则 -execdir 未由 POSIX 指定,但主要实现(至少 GNU 和 BSD 实现)支持它。如果您需要严格的 POSIX 合规性,您将不得不使用不太安全的 -exec,在这种情况下需要额外考虑才能正确应用。

最后,请在带有虚拟文件的测试目录中尝试您的命令,而不是您的实际数据。特别是使用 find-delete 选项,您可以比想象中更快地丢失所有数据。阅读the man page而且,如果这还不够,reference manual 查找。如果您不理解,切勿盲目地复制互联网上随机发布的陌生人的 shell 命令。

关于Linux递归复制文件到其父文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com