根据目录前缀名称查找文件并复制到目录

根据目录前缀名称查找文件并复制到目录

问题:

有人可以展示在 shell 脚本中执行此操作的最简单方法吗?

我有以下包含目录名称的列表:

head -3 list.txt

271_Lsasrv_dll_MS04-011
350_Util_Manager_MS04-019
351_POSIX_MS04-020

cd对于现有目录中的list.txt 中的每个条目:

cd 271_Lsasrv_dll_MS04-011/

获取前缀号码并在/usr/share/exploitdb/路径中搜索

find /usr/share/exploitdb/ -name  271.*
/usr/share/exploitdb/platforms/windows/local/271.c

将文件复制到现有目录

cp /usr/share/exploitdb/platforms/windows/local/271.c .

移回父目录:

cd ..

操作系统信息:

uname -a
(Debian 4.6.4-1kali1)

我尝试了什么?

我发现创建目录很简单......

for fldr in $(cat list.txt); do mkdir -p $fldr; done

...但不确定使用剪切和分配变量等的最佳方法。学习有经验的 Linux 用户如何处理这个问题会很棒。

答案1

尝试一下,如果需要改进,请告诉我:

while read line; 
do
  mkdir -p "${line}"
  prefix=`echo "${line}" | cut -d'_' -f1`
  find /usr/share/exploitdb/ -name  "${prefix}".* -exec echo {} "${line}/" \;
done < list.txt

如果命令输出对您来说没问题,请将 替换echocpthe 。find

答案2

< list.txt xargs -r sh -fc '
   mkdir -p "$@"
   cmd="find /usr/share/exploitdb -name ${1%%_*}.* -exec cp -vt $1/. {} +"; shift
   for d; do cmd="${cmd} -o -name ${d%%_*}.* -exec cp -vt $d/. {} +"; done
   $cmd
' sh

在职的:

  • 起点是list.txt流入的文件,xargs然后将它们以 slurp 模式移交给sh其参数列表。
  • 接下来创建目录(如果尚不存在)。
  • 现在,我们根据传递给我们的数据dynamically构建find命令,方式是立即拉取所有通用命名的文件,然后cp立即拉到适当的目录。这有助于将 的调用保持find在最低限度。例如,find对于以下所示的数据集,该命令将如下所示OP

    find /usr/shar/exploitdb -name 271.* -exec cp -vt 271_Lsasrv_dll_MS04-011/. {} + -o -name 350.* -exec cp -vt 350_Util_Manager_MS04-019/. {} + -o -name 351.* -exec cp -vt 351_POSIX_MS04-020/. {} +

  • 假设该目录不包含空格和 shell 元字符。

相关内容