![](/img/trans.png)
[英]Find directories by name where parent directory contains a certain filename
[英]How to copy directories where the directory name contains a string
我想提取目录名称包含某些字符串(人名!)的任何目录。 特别是在这种情况下Rob\\ G
或Marwa \\E
。
我已经阅读并可以看到如何使用以下命令对电子表格中指定的列表中的文件名执行此操作:
mkdir -p destination_folder || exit 1
while IFS= read -r name; do
find . -path ./destination_folder -prune -o \
-type f -name "$name" -exec cp {} destination_folder \;
done <filenames.txt
但我不知道如何使它适用于复制整个目录。 这是我正在查看的文件目录树的截断版本。非常感谢任何帮助!
$ tree -L 3
.
|-- 2020
| |-- 10\ October
| | |-- Aiyin
| | |-- Rob\ G
| | |-- Yada
| | |-- Yavuz
| | |-- Ying\ H
| | `-- sophie
| `-- 9\ September
| `-- Nacho
`-- 2021
|-- 1\ January
| |-- Agnes
| |-- Marwa\ E
| |-- Ilaria\ M
| |-- Sameer\ Bahal
| |-- Sandra\ C
| |-- Xin
| `-- Yada
|-- 10\ October
| |-- Aiyin
| |-- Alba
| |-- Marwa\ E
| |-- Xin
| |-- Ying
| `-- Rob\ G
|-- 7\ July
| |-- Aakash\ M
| |-- Aiyin
| |-- Rob\ G
|`--|-- Alexia
不是将包含名称的文件重定向到命令,而是使用 echo 和 sed (以转义反斜杠)解析 names.txt 文件,如下所示:
mkdir -p destination_folder || exit 1
echo "$(sed 's/\\/\\\\/g' names.txt)" | while IFS= read -r name; do
find . -type d -name "$name" -exec cp -r {} destination_folder \;
done
其他添加是cp
的-r
标志,以便它递归地复制目录及其内容。
另外, find
一个带有-type d
标志的目录。
您的names.txt
必须包含您要names.txt
的文件夹的确切名称,每个文件夹都在自己的行上。 根据你的例子,如果你想复制Rob\\ G
和Marwa\\ E
,你的names.txt
应该是:
Rob\ G
Marwa\ E
现在请记住,这会将此类文件夹中的所有文件复制到destination_folder/NAME
。 如果您有两个同名文件夹,其中包含同名文件,则之前的文件将被覆盖! (例如,如果./2020/10\\ October/Rob\\ G
和./2021/7\\ July/Rob\\ G
都包含名为exam.txt
的文件,则只有一个exam.txt
将保留在目标中)
如果这是一个问题,您可以尝试使用-exec
操作添加一些排序或重命名功能。
这可能有帮助:
我使用locate
来查找具有特定名称的文件和文件夹。 请注意,如果您的系统上没有locate ,请使用以下命令sudo apt install mlocate
locate Rob > name.txt
这里 Rob 是我们正在搜索的文件夹名称,我们已将所有可能性保存在一个带有“name.txt”的文本文件中。
grep -wi "Rob" name.txt
使用 grep 命令,我们在 name.txt 中搜索 Rob。 这里-w
是查找确切的单词,而i
是查找大小写的可能性。
我已经使用grep
来过滤你的模式。 此脚本将复制包含的目录
anyword with \\ space anyletter/
并将所有目录复制到destination
#!/bin/bash
paths=($(ls -d $PWD/*/*/*/ | grep -- '[a-zA-Z]*\\ [A-Z]/'))
j=0
len=${#paths[@]}
while [[ $j -lt $len ]]
do
echo ${paths[$j]} ${paths[$j+1]}
cp -r "${paths[$j]} ${paths[$j+1]}" /path/to/destination/
j=$(($j+2))
done
您还可以通过简单地修改 grep 命令来使用您的模式
paths=($(ls -d $PWD/*/*/*/ | grep -- 'Rob\\ G/'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.