1

ファイルのセットを連結する必要があります。ディレクトリ構造は次のようになります。

root/features/xxx/multiple_files... -> root/xxx/single_file

私が書いたもの(そしてそれはうまくいきます):

for dirname in $(ls -d root/features/*|awk -F/ '{print $NF}');do;mkdir root/${dirname};cat root/features/${dirname}/* > root/${dirname}/final.txt;done

しかし、shシェルを介して同じことを実行すると

/bin/sh -c "for dirname in $(ls -d root/features/*|awk -F/ '{print $NF}');do;mkdir root/${dirname};cat root/features/${dirname}/* > root/${dirname}/final.txt;done"

それは私にエラーを与えます:

/bin/sh: -c: line 1: syntax error near unexpected token `201201000'
/bin/sh: -c: line 1: `201201000'

私のプロセスは、コマンドを実行する前に常に/ bin /sh-cを追加します。ここで何がうまくいかない可能性があるかについての提案はありますか?別の方法はありますか?私はこれに本当に長い時間を費やしましたが、あまり前進することはありませんでした!

編集: `ls -d root/features/*|awk -F/ '{print $NF}'戻り値

201201
201201000
201201001
201201002
201201003
201201004
201201005
201201006
201201007
201202000
201205000
201206000
201207000
201207001
201207002
4

2 に答える 2

5

常にsh -c 'cmd1 | cmd2'一重引用符で使用してください。

常にsh -eu -xv -c 'cmd1 | cmd2'デバッグに使用します。

コードがBash固有の場合は、常に使用しbash -c 'cmd1 | cmd2'てください(プロセス置換などを参照)。

;doに削除しfor ... ; do; mkdir ...ます。

次のように、可能な一重引用符を一重引用符で囲みます ' --> '\''

(そして、コードをフォーマットするだけで多くのことが明らかになることがあります。)

コマンドに適用すると、これは次のようになります...

# test version
/bin/sh -c '
   for dirname in $(ls -d /* | awk -F/ '\''{print $NF}'\''); do
     printf "%s\n" "mkdir root/${dirname}";
     printf "%s\n" "cat root/features/${dirname}/* > root/${dirname}/final.txt"; 
     echo
   done
' | nl

# test version using 'printf' instead of 'ls'
sh -c '
   printf "%s\000" /*/ | while IFS="" read -r -d "" file; do
     dirname="$(basename "$file")"
     printf "%s\n" "mkdir root/${dirname}";
     printf "%s\n" "cat root/features/${dirname}/* > root/${dirname}/final.txt"; 
     echo
   done
' | nl
于 2013-02-01T14:51:28.350 に答える
1

ボックスに設定した小さなテスト環境でこれを実行しました。二重引用符が気に入らなかったことがわかりました。私が遭遇した問題は、awkステートメントの周りの引用符でした...二重引用符で囲むと、すべてが印刷されます.....目的の結果を得るためにカットを使用しましたが、おそらく-fargを2ではなく3に変更します。

/bin/sh  -c 'for dirname in $(ls -d sh_test/* | awk -F/ '\''{print $NF}'\''); do mkdir sh_test_root/${dirname}; cat sh_test/${dirname}/* > sh_test_root/${dirname}/final.txt;done'

編集:naduによって提案されたテスト済みの編集であり、正常に機能します。上記はその変化を反映しています。

于 2013-02-01T03:25:52.493 に答える