themes.txt
我有许多名为(但内容不同)的文件分散在各个文件夹中。
我想使用locate
命令(不是find
!!!)来搜索它们,并使用cp -backup
命令将它们复制到名为 的文件夹中/home/myhome/1
。
Linux Mint 20.3 可以吗?如果没有,是否有替代解决方案?
答案1
如果您locate
支持-0
选项(用于 NUL 分隔输出) and -e
(进行额外检查以确保文件仍然存在)并且有 GNU cp
andsort
和 axargs
支持-r
and -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'
此操作,我发现实现速度要快得多mlocate
(mlocate
手册提到您可以使用\themes.txt
代替,但这至少'[t]hemes.txt
不适用于实现)。plocate
答案2
cp --backup=numbered $(locate themes.txt) /home/myhome/1
答案3
恕我直言,用于locate
任何需要解析其输出的内容可能最好使用find
shell 循环来完成。部分是由于 Unix 文件名的性质(它们可能包含换行符),部分是由于locate
使用的数据库可能已过时。
你可以不使用 和find
来locate
完成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
如果没有匹配的名称,则使用failglob
in 来使命令正常失败(如果模式与任何名称都不匹配,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
尽可能减少调用次数。