`ls`の出力を解析していますが、何か問題が発生しました


1

この単純なスクリプトを作成して、ファイルを再帰的に多くのサブディレクトリにコピーしました。ここでは、3つのサブディレクトリの問題を示しています。次のようにディレクトリに3つのサブディレクトリと2つのファイルがあります

0.003/  0.007/  0.015/  program.cpp  driver.sh*

以下に示すようprogram.cppに、これらすべてのサブディレクトリにコピーしたいmyscript.sh

    #!/bin/bash
    mydir=`pwd`

    for i in `ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'`
    do
        if [ -e $mydir/$1 ]
        then
            echo "cp -i $1 $i/"
        else
            echo "File \"$1\" not found in current directory"
        fi
    done

コードをテストするためにcp内部echoを配置しました。出力がおかしい、

cp -i program.cpp 32/
cp -i program.cpp 0.003/
cp -i program.cpp 0.007/
cp -i program.cpp 0.015/

の出力 ls -la

total 32K
drwxr-xr-x. 5 gulu workg 4.0K Nov 29  2013 .
drwxr-xr-x. 7 gulu workg 4.0K Nov 29  2013 ..
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.003
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.007
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.015
-rw-r--r--. 1 gulu workg 4.2K Nov 29  2013 program.cpp
-rwxr-xr-x. 1 gulu workg  982 Nov 26 08:22 driver.sh

の出力 ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'

0.003
0.007
0.015

3つの値しかありませんiが、4つの出力をどのように生成しますか?とにかく、追加の条件で問題を解決しました[ -d $mydir/$i ]。しかし、私の質問は、スクリプトが最初の行をどのように生成するcp -i driver.sh 32/かということです。


1
リストの最初の「d」と一致させることができます。awkはgrepの機能を実行できることに注意してくださいls -la $mydir| awk '/^d.*[0-9]$/ {print $NF}'
エマニュエル

@Emmanuelはい、実際にはより良い提案です。ありがとう。
souravc

回答:


4

これは、lsディレクトリの内容を反復処理するためにコマンドの出力の解析に決して頼るべきではない理由を示しています-代わりに単純なシェルグロブを使用します。

for f in $mydir/*[0-9]
do
    if [ -e $mydir/$1 ]
    .
    .
done

lineの生成方法についてはcp -i driver.sh 32/、の出力で数字をgrepすると、行と目的のディレクトリ名ls -laが一致することがわかりtotal: 32Kます。


ああ!あなたが指摘するとき、今私はそれを得ましたls。私はあちこちで欠陥を見つけていました。実際に私.bashrclsasのエイリアスを置き'ls -h --color=auto'ます。これが、フィールドでls -la表示total 32Kおよびフィルター処理された出力がgrep数字で終了する理由です。しかし、スクリプトが実行されているとき、/bin/ls最初の行をとして読み取る4つの値を使用および取得していると思いますtotal 32。私は良い教訓を学びました。ご協力ありがとうございます。
souravc

1

これは、ディレクトリの内容を反復処理するためにlsコマンドの出力の解析に決して頼るべきではない理由を示しています-単純なfindコマンドを使用します。

find . -maxdepth 1 -type d --regex './[0-9]+$' -exec cp $1 {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.