问题:
有人可以展示在 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
如果命令输出对您来说没问题,请将 替换echo
为cp
the 。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 元字符。