3

ファイルを見つけて、最初に見つけたファイルを別のディレクトリに awk/copy する bash/shell 関数があります。残念ながらfile、名前にスペースが含まれるディレクトリを含む場合、何らかの理由でパスが切り捨てられるため、すべてが失敗します。どうすれば修正できますか?

file.txt が /path/to/search/にある場合、スペースが悪い/ 失敗します。

dir=/path/to/destination/ | find /path/to/search -name file.txt | head -n 1 | awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | sh

cp: /path/to/search/spaces: No such file or directory

* file.txt が /path/to/search/ spacearebad / にある場合は機能しますが、スペースがないことに注意してください。:-/

4

3 に答える 3

3

Awk のデフォルトのセパレーターは空白です。次のようにして、単に別のものに変更します。

awk -F"\t" ...

スクリプトは次のようになります。

dir=/path/to/destination/ | find /path/to/search -name file.txt | head -n 1 | awk -F"\t" -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | sh

コメントで指摘されているように、これらすべての手順は実際には必要ありません。実際には単純に実行できます (ワンライナー):

dir=/path/to/destination/ && path="$(find /path/to/search -name file.txt | head -n 1)" && cp "$path" "$dir"

フォーマットされたコード (この場合は見栄えが良いかもしれません^^):

dir=/path/to/destination/
path="$(find /path/to/search -name file.txt | head -n 1)"
cp "$path" "$dir"

""、文字列の内容全体を変数に割り当てるために使用さIFSれます。これにより、デフォルトでは空白であるセパレーターが文字列と見なされなくなります。

于 2013-01-02T22:18:53.307 に答える
2

スペースが悪いと思う場合は、改行の問題が発生するまで待ってください。たとえば、次のように考えてください。

mkdir spaces\ are\ bad
touch spaces\ are\ bad/file.txt
mkdir newlines$'\n'are$'\n'even$'\n'worse
touch newlines$'\n'are$'\n'even$'\n'worse/file.txt

と:

find . -name file.txt                                   

head コマンドは、改行区切り文字を想定しています。\0区切り文字を使用して、GNU find および GNU grep (おそらく他のもの) でのスペースと改行の問題を回避できます。

find . -name file.txt -print0 | grep -zm1 . | xargs -0 cp -t "$dir"
于 2013-01-02T22:37:26.133 に答える
0

これを試すことができます。

awk '{print substr($0, index($0,$9))}'

たとえば、これは ls コマンドの出力です。

-rw-r--r--. 1 root root 73834496 12 月 6 日 10:55 スペースを含むファイル 2

このような単純な awk を使用する場合

# awk '{print $9}'

返すだけ

# File

完全なコマンドで使用する場合

# awk '{print substr($0, index($0,$9))}'

出力全体を取得します

スペースを含むファイル 2

ここで substr(s, a, b) : 位置 a から始まる文字列 s から b 個の文字を返します。パラメータ b はオプションです。

たとえば、一致が addr:192.168.1.133 で、次のように substr を使用する場合

# awk '{print substr($2,6)}'

IP、つまり 192.168.1.133 を取得します。6 は in addr で始まる文字であることに注意してください

したがって、適切なコマンドでは、$2 は $0 (行全体を出力します) であり、index($0,$9) は $9 に一致し、列 9 より前のすべてを出力します。これを index($0,$8) に変更して、出力が変化することを確認できます。に

# 10:55 File with spaces 2

`index(IN, FIND)' これは、文字列 IN で最初に出現する文字列 FIND を検索し、文字列 IN でその出現が始まる位置を文字数で返します。

お役に立てば幸いです。さらに、この値をスクリプト内の変数に割り当てる場合は、変数を二重引用符で囲む必要があります。そうしないと、抽出されたファイル名に対して他の操作を行っている場合にエラーが発生します。

于 2016-12-06T06:53:01.563 に答える