查找搜索和复制文件的替代方法?

查找搜索和复制文件的替代方法?

themes.txt我有许多名为(但内容不同)的文件分散在各个文件夹中。

我想使用locate命令(不是find!!!)来搜索它们,并使用cp -backup命令将它们复制到名为 的文件夹中/home/myhome/1

Linux Mint 20.3 可以吗?如果没有,是否有替代解决方案?

答案1

如果您locate支持-0选项(用于 NUL 分隔输出) and -e(进行额外检查以确保文件仍然存在)并且有 GNU cpandsort和 axargs支持-rand -0(所有这些都应该是 Linux Mint 上的情况):

LC_ALL=C locate -0e '*/themes.txt' |
  LC_ALL=C sort -zV |
  xargs -r0 cp -t ~/1 --backup=numbered

sort -V是为了获得一些非随机顺序(此处为版本排序),其中文件将被复制,这不是必需的。

locate -0e '*/themes.txt'搜索themes.txt精确调用的文件,您也可以执行locate -0be '[t]hemes.txt'此操作,我发现实现速度要快得多mlocatemlocate手册提到您可以使用\themes.txt代替,但这至少'[t]hemes.txt不适用于实现)。plocate

答案2

 cp --backup=numbered $(locate themes.txt) /home/myhome/1

答案3

恕我直言,用于locate任何需要解析其输出的内容可能最好使用findshell 循环来完成。部分是由于 Unix 文件名的性质(它们可能包含换行符),部分是由于locate使用的数据库可能已过时。

你可以不使用 和findlocate完成bash

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    cp -b "$pathname" ~/1/
done

这将首先启用通配模式的使用**,该模式在路径名中进行匹配/(因此“递归”地匹配到子目录中)。然后,它可以nullglob删除不匹配的模式并dotglob允许模式匹配隐藏的名称。

该循环迭代您可能想要移动的所有名称,在当前目录或任何子目录中匹配它们,然后将每个名称cp -b-b与 相同)复制到您的主目录下--backup调用的目录。1

这假设当前目录不是您的主目录,因为这将包括目标目录中的文件。

如果您知道您只有其中一些themes.txt文件,您可以使用以下命令

shopt -s globstar dotglob failglob
cp -b -t ~/1/ ./**/themes.txt

如果没有匹配的名称,则使用failglobin 来使命令正常失败(如果模式与任何名称都不匹配,shell 甚至不会尝试运行该命令)。nullglob

请注意,上述命令不会测试匹配的名称是否实际上是常规文件(它们可以是目录、符号链接或任何其他类型的非常规文件)。为此,您可以使用

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    if [ -f "$pathname" ] && [ ! -L "$pathname" ]; then
        cp -b "$pathname" ~/1/
    fi
done

这只复制常规文件,并避免非常规文件和常规文件的符号链接。


有了find,你只需做

find . -name themes.txt -type f -exec cp -b -t ~/1/ {} +

也就是说,从当前目录或以下目录中的任何位置一次调用尽可能cp -b -t ~/1/多的常规文件。themes.txt这样做的好处是可以cp尽可能减少调用次数。

相关内容