1

このコマンドを実行すると、ターミナルで正常に機能します。

for dirname in $(ls -d dir/checkpoint/features.txt/20*);do;echo "hello";done

ただし、/ bin / sh -cを実行すると、エラーが発生します

/bin/sh -c "for dirname in $(ls -d dir/checkpoint/features.txt/20*);do;echo "hello";done"

エラー:

/bin/sh: -c: line 1: syntax error near unexpected token `dir/checkpoint/features.txt/201108000'
/bin/sh: -c: line 1: `dir/checkpoint/features.txt/201108000'

私のデフォルトのシェルは/bin/bashです。何が原因なのか理解できないようです。プログラムですべてのシェルコマンドを実行するためのデフォルトの実装は、それらに/ bin /sh-cを追加することです。この問題が発生するのは初めてです。助言がありますか?

4

1 に答える 1

2

の出力を解析しようとしないでください。ls特にfor構造体を使用している場合は注意してください。これがうまくいかない方法はたくさんあります。

これは、find代わりに使用するのに適した場所です。これを試して:

/bin/sh -c "find dir/checkpoint/features.txt -mindepth 1 -maxdepth 1 -type d -iname '20*' -exec echo \"hello\" \;"

エラーが発生しやすい の使用を排除するだけでなく、lsサブシェルとそれに伴うすべての問題を回避できます。

コメントへのフォローアップ:

awk -F/ '{print $NF}'ファイルが存在するフォルダーの名前 (つまり、ファイル名の前の最後のディレクトリ名) を取得するために使用していると仮定しています。コマンドbasenamedirnameを使用して、これを行うことができます。これにより、スクリプトが少し簡単になります。以下をスクリプト ファイルに配置します。

#!/bin/sh
folder=$(basename $(dirname $1))
mkdir -p #{nfs_checkpoint}/${folder}
cat #{result_location}/${folder}/20* > #{nfs_checkpoint}/${folder}/features.txt

そして、次のように実行します。

/bin/sh -c "find dir/checkpoint/features.txt -mindepth 1 -maxdepth 1 -type d -iname '20*' -exec yourscript.sh {} \;"
于 2013-02-01T00:35:55.383 に答える