질문:
누군가 쉘 스크립트에서 이 작업을 수행하는 가장 간단한 방법을 보여줄 수 있습니까?
디렉터리 이름이 포함된 다음 목록이 있습니다.
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
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
으로 전달됩니다 .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/. {} +
디렉토리에는 공백과 쉘 메타 문자가 포함되어 있지 않은 것으로 가정됩니다.