2

Linuxで非常に単純なスクリプトを書こうとしています。
最初にコードをお見せしましょう:

#!/bin/bash
# The shell program uses glob constructs and ls
# to list all entries in testfiles, that have 2
# or more dots "." in their name.

ls -l /path/to/file/*.*.*

このコードをbash myscriptコマンドで実行すると、次のようになります。/path/to/file/file.with.three.dots

しかし、私はこれを望んでいません。パスではなく、ファイル名のみを表示したい。
それから私は試しました:

ls -l *.*.*

しかし、今回は、私が/ path / to / file /内にいる場合にのみ、ファイルを表示します。
パスを設定するにはどうすればよいですか。スクリプトを任意の場所から実行すると、/ path / to / file /内のファイルの名前が出力されますか?

ありがとうございました!

4

5 に答える 5

7

basename path/to/file.b.cあなたにfile.bcを与えるべきです

cdただし、質問を読み直すと、パスへの一時的なものだと思いますが、次のlsほうがよい場合があります。

(cd /path/to/file; ls -l *.*.*)
于 2013-02-06T04:04:44.607 に答える
2

最初のコード:

ls -l /path/to/file/*.*.* | awk -F '/' '{print $NF}'

ここでの説明: 選択したファイルをリストし、それに対して awk を使用します。スイッチ -F は、分割に使用する文字 (この場合は /) を決定します。次に、「最後のもの」を意味する「$NF」の値を awk で出力します。/path/to/file/file.with.three.dots です。それを分割し、最後のもの (file.with.three.dots) を取得して (パスの長さや深さに関係なく) 印刷します。ファイル システム上の現在の位置を変更する必要はありません。

私は本当に願っています、私は助けました。

于 2013-02-06T07:37:18.277 に答える
1

または、find コマンドを使用します。

$> find /path/to/file -printf %f\\n\\r
于 2014-11-26T09:09:22.413 に答える
0

basename に固執することをお勧めします。

ls -1 /path/to/file/*.*.* | while read path
do
    basename "$path"
done

$(ls /path/ )* の for pathではなくwhile readを使用するのが最善です。これは、パスにスペースが含まれている場合にのみ、for ループがパスをセグメント化するためです。

于 2013-02-06T08:42:00.940 に答える