ディレクトリプレフィックス名に基づいてファイルを見つけてディレクトリにコピーする

ディレクトリプレフィックス名に基づいてファイルを見つけてディレクトリにコピーする

質問:

誰かがシェルスクリプトでこれを行う最も簡単な方法を示すことはできますか?

ディレクトリ名を含む次のリストがあります。

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

コマンド出力が大丈夫に見えたらechocpfind

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

  • ディレクトリには、スペースとシェルのメタ文字が含まれていないと想定されます。

関連情報