1

ディレクトリに移動し、ファイルが存在する場合はそれを除いてサブディレクトリを削除するシステムコマンドを実行する必要があります。この操作を実行するために、次のコマンドを作成しました。

system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done");

上記のコマンドは構文エラーをスローし続けます。私は複数の組み合わせを試しましたが、これがどうあるべきかまだはっきりしていません。提案してください。

4

4 に答える 4

6

コマンド ラインに構文エラーが含まれています。これを試して:

system("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");

またはさらに良いのは、最初にディレクトリのみをループすることです。

system("for i in /home/faizan/test/cache/*/.; do echo \$i; done");

または、さらに良いことに、ループなしで実行します。

system("echo /home/faizan/test/cache/*/.");

(適切にデバッグされたら、rmdir代わりにやりたいと思うでしょう。)echo

または、すべて Perl で行うことをお勧めします。ここには を必要とするものは何もありませんsystem()

于 2012-12-26T10:46:19.493 に答える
1

質問のタイトルはコマンドの略なのでsystem、これは直接回答しますが、bashを使用したサンプルコマンドには、perlのみでより単純になるもののみが含まれています(opendirおよび-dperlを使用した他の回答を見てください)。

system(の代わりに)を使用する場合、またはのopen $cmdHandle,"bash -c ... |"ような実行コマンドの推奨される構文は、コマンド ラインを解析できるようにすることです。systemexecperl

これを試してください(すでに行っているように):

perl -e 'system("bash -c \"echo hello world\"")'
hello world

perl -e 'system "bash -c \"echo hello world\"";'
hello world

そして今、同じですが、perlコマンドラインの解析を確実にするために、これを試してください:

perl -e 'system "bash","-c","echo hello world";'
hello world

systemコマンドには明らかに 3 つの引数があります。

  1. バッシュ
  2. -c
  3. スクリプト

またはもう少し:

perl -e 'system "bash","-c","echo hello world;date +\"Now it is %T\";";'
hello world
Now it is 11:43:44

最後の目的でわかるように、コマンド ラインのbash スクリプト部分を囲む二重引用符はありません。

**注意: コマンド ラインでperl -e '...'orを使用perl -e "..."すると、引用符と二重引用符をいじるのは少し重くなります。スクリプトでは、それらを混在させることができます:

system 'bash','-c','for ((i=10;i--;));do printf "Number: %2d\n" $i;done';

あるいは:

system 'bash','-c','for ((i=10;i--;));do'."\n".
                       'printf "Number: %2d\n" $i'."\n".
                       'done';

(スクリプト部分)文字列の一部を連結.するためにドットを使用すると、常に3つの引数があります。

于 2012-12-26T10:40:12.993 に答える
1

最初にこれを bash コマンドとして試すのが最善です。適切に書式設定すると、ステートメント ターミネータが欠落していることがより明確になります。

for i in *; do
    if [ -d "$i" ]; then
        echo $i
    fi
done

そして、新しい行をセミコロンに置き換えることでそれを要約します(do/の後を除くthen):

for i in *; do if [ -d "$i" ]; then echo $i; fi; done

または、前述のように、Perl で実行します (remove_tree のコメントを実際に外すまではテストしていません - 注意してください!):

use strict;
use warnings;

use File::Path 'remove_tree';
use feature 'say';

chdir '/tmp';
opendir my $cache, '.';
while (my $item = readdir($cache)) {
    if ($item !~ /^\.\.?$/ && -d $item) {
        say "Deleting '$item'...";
        # remove_tree($item);
    }
}
于 2012-12-26T10:50:08.107 に答える
1

システムの使用

my @args = ("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
system(@args);

サブルーチンの使用

sub do_stuff {
  my @args = ( "bash", "-c", shift );
  system(@args);
}

do_stuff("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
于 2012-12-26T10:57:53.027 に答える