例えば以下のディレクトリに次のようなデータがあるとします。
/home/work/test

・INV_20110401000001.csv
・INV_20110401000002.csv
・INV_20110401000003.csv

これらのファイルの中から最新の更新日時のファイルのパスを取得したいのですが、
良い方法が思いつきません。
末尾の数字が大きいものが最新ファイルとは限らず、
ファイルがいくつあるかも日によってかわります。

testコマンドでは比較ファイルを2つまでしか指定できず困っています。
どなたかご存知の方がいれば教えていただきたいです。
よろしくお願いいたします。

A 回答 (3件)

ls -lrt |tail -n 1|awk '{print $9}'



がぱっと思いついた方法でした
リバースをせずにheadで良いか・・・
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
教えていただいた方法で希望通りの結果を得ることができました。
たびたび申し訳ないのですが、たとえばこのファイルの中に複数のファイル名が
存在した場合、ファイル名'INV'が含まれるファイルの最新ファイルを取得することは可能でしょうか?

お礼日時:2011/04/12 18:21

>そこからどうやってパスを取得するのでしょうか?



プログラム書いてるんでしょうからいろいろ考えましょうよ・・・

最新のファイル名を取得するならこれが一番簡単かな。
ls -1t | head -n1

※「ls -」の次は小文字のエルではありません。数字の1です。ご注意。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
Shell初心者なものでただいま勉強中です...
頂いた意見大変参考になりました。

お礼日時:2011/04/12 19:47

ls -lt


で更新日順に表示させれば取得できませんか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
そこからどうやってパスを取得するのでしょうか?

お礼日時:2011/04/12 17:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLinuxでディレクトリ内の最新ファイルとファイル数を取得したいです。

ディレクトリ内にファイルが多すぎて
lsしても画面が流れてしまい困っています。

・ディレクトリのファイル数を取得したい
・ディレクトリ内の最新ファイルの日付を取得したい
のですがどうしたら良いでしょうか?

Aベストアンサー

> lsしても画面が流れてしまい困っています。
ls -ltr | more /// スペースキーで画面スクロール。
ls -ltr | tee a.txt /// a.txt にファイル名が出力されます。(リダイレクト">"よりはいいですよ。)

>・ディレクトリのファイル数を取得したい
ls -ltr | wc -l

>・ディレクトリ内の最新ファイルの日付を取得したい
ls -ltr | tail -1

Qサブディレクトリも含めて最新のファイルを調べる

Linux 上のあるディレクトリ配下に存在するすべてのファイルの中で(サブディレクトリ配下も含めて)
更新日時が最新のファイルを抽出したいのですが
やり方をご存知であれば教えてください。

ディレクトリが一つだけ or 対象が特定できるなら ls -lrt とかで分かりますが
再帰的にすべてのサブディレクトリを対象としたいのです。

できれば1回のコマンド(ワンライナー)で実行できるとありがたいですが、
それはさすがに大変な気がしますので、
あくまでできればということで。。

Aベストアンサー

find $DIR -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1

でどうでしょう。ソートキーは、ls のデフォルトオプションによってずれるかもしれないので、見て確認してください。
find に -mtime オプションを追加することで調べるファイルを減らすと良いかと。

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qfindでフォルダだけを検索

find / -name "apache*"
これを、フォルダだけヒットするような文にするとどうなりますか?

Aベストアンサー

がると申します。

find / -name "apache*" -type d
でいかがでしょうか?

Qsolarisのdateコマンドで

solarisのdateコマンドを用いて一昨日の日付を出力したいのですができません。

どのようにやるのでしょうか?

Aベストアンサー

Solaris標準のdateコマンドではできません。
GNUのsh-utilsを別途入れる必要があります。
そうすれば1日前の日付を出したい場合は、$ date --date '1 days ago' が可能になります。

参考URL:http://www.rinneza.com/junya/tech/solaris10_x86/

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Qシェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。

以下の単純なシェルスクリプトを実行しようとしています。
-------------------
#!/bin/sh
echo ok
-------------------
そのとき、
bad interpreter: そのようなファイルやディレクトリはありません
と出てしまいます。

・which sh で確認すると /bin/sh です。
・Windowsで作ったファイルをFTPのアスキーモードで転送しています。

(ものすごく単純なミスをしてるのかもしれませんが、)
よろしくお願いします。

Aベストアンサー

1行目の「/bin/sh」のうしろにCRが入っていると、このような現象が発生します。
FTPの転送モードが間違いなくアスキーモードになっているか、
転送後のファイルにCRがついていないかなど、再度確認してみてください。

CR以外のコントロールコードや全角スペースなどがついていても似た現象が起こります。
その場合はエラーメッセージが多少異なるはずですが、併せて確認しておくと良いかと思います。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Q-bash: ftp: コマンドが見つかりません

ftpでファイルを転送したいのですが、現在出来ておりません。
因みにその端末(サーバ)は外部からのftpのやり取りも必要な為、vsftpdをインストールしています。
試しに、コマンドでftpと入力した時に題目のようなエラーが表示されます。

Linuxはまだ経験が殆ど無く、シェルに関してもまだ分かりません。

ftpクライアントのインストールとか必要でしょうか?
それとも何か追加設定が必要でしょうか?

途中のファイアーウォール機器では通過の設定ができております。

教えていただけますでしょうか。
宜しくお願い致します。

Aベストアンサー

echo ${PATH}

として、パス(コマンドサーチパス)を確認してみてください。

その上で、

find / -name ftp -print > /tmp/find.log

として、「ftp」コマンドがどこのディレクトリにあるかを確認してください。
※ エラーメッセージ(~:許可がありません)が出力されますが、無視してください。

cat /tmp/find.log

/usr/kerberos/bin/ftp
/usr/bin/ftp


そのあとで、「/etc/profile」に、「ftp」コマンドが存在するディレクトリを追記してください。

最終行に追加
PATH=/usr/kerberos/bin:/usr/bin:$PATH

いったん、ログアウトしてログインして、パスが追加できてるかを確認してください。
echo ${PATH}

追加できてれば、「ftp」コマンドが使えるようになっているはずです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング