lsを使いたいですか? Bash変数のオプション。
同じタスクを実行するためにスクリプトをどのように取得できますかls -lt foobar_??????.log
?
$ cat foobar_ls.sh
#!/bin/bash
FOOBAR_LIST="foobar_??????.log"
ls -lt "$FOOBAR_LIST"
これはプロンプトバージョンです:
$ls -lt foobar_??????.log
-rw-r--r-- 1 foobar foobiz 0 Nov 1 14:58 foobar_000003.log
-rw-r--r-- 1 foobar foobiz 0 Nov 1 14:58 foobar_000002.log
-rw-r--r-- 1 foobar foobiz 0 Nov 1 14:58 foobar_000001.log
これは私のバージョンのスクリプトです。
$ ./foobar_ls.sh
ls: cannot access foobar_??????.log: No such file or directory
答え1
?
関数ではなく、ls
シェルの関数です。ファイル名拡張子またはワイルドカード拡張またはパターンマッチングワイルドカード。ls
一致するファイル名のリストを取得するには、シェルでワイルドカード拡張を実行する必要があります。
変数にワイルドカード文字を含む文字列があり、そのワイルドカード文字を一致するファイル名に拡張するには、変数の置換を引用符なしで残します。これは「split+glob」演算子です。値はスペースで区切られた部分に分割され、各部分は一致するファイル名のリストに置き換えられますが、ファイル名と一致しない部分は変更されません。
FOOBAR_LIST="foobar_??????.log"
ls -lt $FOOBAR_LIST
答え2
これは私にとって効果的でしたが、実行している操作によっては、変数を引用符で囲んでいないままにしておくことはお勧めできません。おそらく、次のもの以外のものを使用する必要がありますls
。 http://mywiki.wooledge.org/ParsingLs
foobar_ls.sh
#!/bin/bash
FOOBAR_LIST="foobar_??????.log"
ls -lt ${FOOBAR_LIST}
これらのファイルの名前を変更するには、次のいずれかを実行できます。
shopt -s nullglob
for file in /path/to/files/foobar_??????.log; do
mv "$file" "${file}.old"
done
shopt -u nullglob
または
find /path/to/files -type f -name 'foobar_??????.log' -exec mv {} {}.old \;