【问题标题】:Linux Command Line - list all directories containing .js files, and copy the directories and their contents to a new folderLinux 命令行 - 列出所有包含 .js 文件的目录,并将目录及其内容复制到新文件夹中
【发布时间】:2020-05-26 19:30:30
【问题描述】:

这是我已经找到并列出所有包含 .js 文件的目录(不包括 node_modules 目录)的代码。

find . -name '*.js*' -printf "%h\n" | sort -u | grep -v node_modules

如您所见,列出这些目录是没有问题的。但是,我不想列出目录,而是将它们(及其内容)复制到一个新文件夹中,最好是在一行中,而不运行任何类型的脚本。

任何帮助将不胜感激!

【问题讨论】:

  • 您要复制目录,包括它们可能包含的任何非 .js 文件吗?
  • 任何一种方式都适合我。如果必须,我可以递归删除任何非 .js 文件。

标签: linux bash file find copy


【解决方案1】:

最安全的方法是使用 NULL 作为分隔符处理目录列表,以便正确处理包含空格(和其他奇数字符)的目录。

如果输出看起来正确,请删除echo

“1 线”

 find "/path/to/tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h\0" | \
    sort -uz | xargs -0 -I _ echo cp -a _ "/path/to/new/dir"

Bash 脚本

这需要 Bash 4 来过滤掉重复的关联数组。

#!/bin/bash

tld="/path/to/top/level/dir"
newdir="/path/to/new/dir"

unset dirHash;
declare -A dirHash

while read -r -d $'\0' dir; do
  (( ! dirHash["$dir"]++ )) && echo cp -a "$dir" "$newdir"
done < <(find "$tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h\0")

【讨论】:

  • 非常感谢!实际上,这两种方法都有效,但是直到我将其更改为:@ 987654324@ 之前,一个衬线才有效,看起来您在@ 987654325@ 之前不小心添加了一个反斜杠。您可能应该更新您的答案。
  • @ScottGreenfield \ 用于行继续,但看起来我在反斜杠和换行符之间添加了一个额外的空格,这让解释器无法正常工作。我删除了空间,它现在应该可以正常工作了(假设你改变了 /path/to/tld 和 /path/to/new/dir 部分)
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2021-04-07
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多