変数をどのように処理しますか?

変数をどのように処理しますか?

一連のファイルを処理したいです。

pi@raspberrypi:~/A6.1 $ ls -1

0bd57df4.code
0bd57df4.enc
3189204c.code
3189204c.enc
39f831fb.code
39f831fb.enc
68ff6d19.code
68ff6d19.enc
find.sh
test.sh

find.shマスクでファイルを検索するスクリプト()を実行し、別のスクリプト(test.sh)を実行して、見つかったファイルの名前を引数として渡します。

テストモードでは、拡張子なしでフルファイル名と省略名を表示したいと思います。

find.shファイルの内容:

#!/bin/bash

find -name '*.enc' -printf "%f\0" | xargs -0 -n 1 ./test.sh

test.shファイルの内容:

# !/bin/bash

NAMEFILE=$1
FULLNAME=$NAMEFILE
CUTNAME=`echo ${NAMEFILE:0:6}`
echo "FULLNAME - "$FULLNAME
echo "FILENAME - $CUTNAME"

フルネームを表示し、省略形は表示しません。エラーメッセージを表示します。変数をどのように処理しますか?

pi@raspberrypi:~/A6.1 $ ./find.sh
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 68ff6d19.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 3189204c.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 39f831fb.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 0bd57df4.enc
FILENAME -

test.shファイルを実行すると機能します。

pi@raspberrypi:~/A6.1 $ ./test.sh 68ff6d19.code
FULLNAME - 68ff6d19.code
CUTNAME - 68ff6d19

答え1

GNU Parallelを使用すると、コードを集中化できるようです。

find -name '*.enc' | parallel echo Full:{} Cut:{.}

またはコードがより複雑な場合:

#!/bin/bash

doit() {
  FULLNAME="$1"
  CUTNAME="$2"
  echo "FULLNAME - $FULLNAME"
  echo "FILENAME - $CUTNAME"
}
export -f doit

find -name '*.enc' | parallel doit {} {.}

答え2

/bin/sh使用している特定のパラメータ拡張を持たないスクリプトを実行すると、エラーが発生します。/bin/sh最初の行の間にスペースがあるため、これを使用します。#!

許可されるスペース後ろにこれ!Shebangで#!と/bin/bashの間にスペースを入れることはできますか?

また関連:Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?


ここでは、単一のスクリプトを簡単に使用できます。

find . -type f -name '*.enc' -exec bash -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n:0:6}"
    done' sh {} +

指定したファイル名に対してこのコマンドを実行すると、

Full name:      0bd57df4.enc
Cut name:       0bd57d
Full name:      3189204c.enc
Cut name:       318920
Full name:      39f831fb.enc
Cut name:       39f831
Full name:      68ff6d19.enc
Cut name:       68ff6d

拡張機能のみを削除する場合:

find . -type f -name '*.enc' -exec sh -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n%.*}"
    done' sh {} +

これは

Full name:      0bd57df4.enc
Cut name:       0bd57df4
Full name:      3189204c.enc
Cut name:       3189204c
Full name:      39f831fb.enc
Cut name:       39f831fb
Full name:      68ff6d19.enc
Cut name:       68ff6d19

関連情報