質問:
誰かがシェルスクリプトでこれを行う最も簡単な方法を示すことはできますか?
ディレクトリ名を含む次のリストがあります。
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/. {} +
ディレクトリには、スペースとシェルのメタ文字が含まれていないと想定されます。