디렉터리 접두사 이름을 기준으로 파일을 찾아 디렉터리에 복사

디렉터리 접두사 이름을 기준으로 파일을 찾아 디렉터리에 복사

질문:

누군가 쉘 스크립트에서 이 작업을 수행하는 가장 간단한 방법을 보여줄 수 있습니까?

디렉터리 이름이 포함된 다음 목록이 있습니다.

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.cpfind

답변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작성합니다 . 이렇게 하면 통화를 최소한으로 유지하는 데 도움이 됩니다. 예를 들어 아래 표시된 데이터 세트의 경우 명령은 다음과 같습니다 .findcpfindfindOP

    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/. {} +

  • 디렉토리에는 공백과 쉘 메타 문자가 포함되어 있지 않은 것으로 가정됩니다.

관련 정보