シェルで上位3つを残してファイルを削除する方法

このQ&Aのポイント
  • シェルスクリプトを使用して指定されたディレクトリ内の上位3つのファイルを残して削除する方法をご紹介します。
  • lsコマンドとawkコマンドを組み合わせて、上位3つのファイルを残して削除する方法を説明します。
  • forループとif文を使用して、ファイルを順番に処理し、上位3つのファイルを残して削除する方法を解説します。
回答を見る
  • ベストアンサー

シェルにて指定された上位3つを残してファイルを削除する

シェルにて指定された上位3つを残してファイルを削除したい A.上記の雰囲気にて、やってみましたが、エラーになります ls -r /tmp/abc | awk '{ if NE >3 rm $1 }' B.次に、下記のように行ってみたいのですが、for文では、ファイル名ソートは、保障されているのでしょうか? i=0 for fname in /tmp/abc/* do let i =i + 1 if [ $i > 3 ] ; then rm fname fi done ※また、他にどのような方法があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「シェルにて指定された上位3つ」は「何が上位なのか」がわからんのでなんともいえない. 期待している動作は「ファイル名をソートしたときに最初の 3つを除いて削除する」ことかなぁ? それなら, 普通は ls |tail -n +4 | xargs rm でもいけると思うけど, 実行するとファイルをすっぱり消しちゃうので実行は慎重に. for の例では, 規格は確認していませんが「シェルが * を展開するときにファイル名をソートしている」はずです.

teto_pun2
質問者

お礼

早速の回答ありがとうございます。 意味不明でしません。上位とは、ファイル名にてソートでした。

関連するQ&A

  • awk外で宣言した変数の参照

    kshを使用して、以下のようなシェルを作成しています。 しかしawk内で$iと$iiが参照出来てない様子です。 どのようにすれば参照できますでしょうか。 ■シェルの中身 #/usr/bin/ksh for i in `cat /tmp/hoge |awk -F : '{ print $3 }' | sort | uniq -d` do if [ $i != "" ]; then for ii in `cat /tmp/hoge` do echo $ii |awk -F ":" '{ if ( $3 -eq $i ) print $ii }' done fi done ■エラー awk: 0602-562 フィールド $() が正しくありません。 入力の行番号は 1 です。 ソースの行番号は 1 です。

  • 【シェル】日付が最も古くサイズが小さいファイル削除

    ディレクトリ内のファイルで、日付が最も古い&(且つ)サイズが小さいものを削除するシェルを作成しようと考えています。 当初の以下のような考えをしていましたが、うまくいかないので質問しました・・・ ls -lStr(カレントディレクトリで日付が古くサイズが小さい順のつもり・・・) 上記のコマンド実行にて、 合計 100 -rwxr-xr-x 1 root root 333 2月 22 2009 java.log と表示されるのを利用し、上から2行目のファイル名を取得するためawkして『java.log』というファイル名をprintfで表示させ変数か何かに格納し、rmコマンドで削除という流れを考えていました。 よくよく考えると ・ls -lStr は本当に日付が古くサイズが小さいものでソートされているのか ・lsコマンドで表示した『2行目』という指定でファイル名の取得できるのか がよくわからなくなってしまいました。 上記の考え方よりこっちのほうが良い!やアドバイスがあれば非常に嬉しいです。 よろしくお願いしますm(__)m

  • シェルでファイルが2Gを超えているかの判定は?

    posix shでファイルが2Gを超えているかの判定を行いたいです。 size=`ls -l FILE | awk '{printf $5}'` if [ $size > 2147483648 ] then echo "2G超え" fi で、出来るかと思いましたがシェルではこのif文が行えません。 全然違う方法でいいのですが なんとかファイルサイズが2G超えか判定する方法は ありますでしょうか?

  • bashシェルでのmysqlCSVファイルについて

    bashシェルでのmysqlCSVファイルについて教えて下さい。 下記のスクリプト実行するとroot権限者で実施すればうまく動作するのですが、 xxxxユーザで実施した場合は、/tmp/mysql_export_linkdata.csvのファイル所有者がxxxxではなく、mysqlになってしまい ファイル削除(rm)ができません。 何が悪くてどう直せばよいですか? chownで変更したり、chmod 777にしたりやってみたのですが 駄目でした。 #/bin/bash if [ -f /tmp/mysql_export_linkdata.csv ] then rm /tmp/mysql_export_linkdata.csv echo rm /tmp/mysql_export_linkdata.csv fi mysql --user=xxxx --password=xxxx dburl <<eof select * from linkdata into outfile "/tmp/mysql_export_linkdata.csv" fields terminated by ','; eof chown xxxx.xxxx /tmp/mysql_export_linkdata.csv chmod 777 /tmp/mysql_export_linkdata.csv ls -lrt /tmp/mysql_export_linkdata.csv echo ls -lrt /tmp/mysql_export_linkdata.csv

  • シェルスクリプトで条件を指定してファイルの加工を行いたいのですが

    シェルスクリプトで条件を指定してファイルの加工を行いたいのですが シェルスクリプト(ksh)で、入力ファイルから条件に該当する行だけ抽出して出力したいと考えています。 ただ1つ条件があって、【awkは使用禁止】です。 処理としては ID00001,山田太郎,社員 ID00002,田中花子,社員 ID00003,中島次郎,派遣 というCSVファイルがあって、3列目の値が社員のものを抽出して ID00001,山田太郎,社員 ID00002,田中花子,社員 というファイルを出力したいのです。 下記のようなシェルになるとは思いますが手詰まりです。awkなら一瞬で終わるのですが、シェルだけですと3列目の抽出方法がよくわかりません。シェルに詳しい方、ご教示願えます。 while read line do if (3行目を抽出する条件); then print ${line} >> output.csv fi done < input.csv

  • シェルでファイルを読み込む

    csh を使っています。 ファイル hoge には1行に一つずつファイルの / からのパスが記されています。 hoge から 1行ずつファイルパスのリスト読み込んでそのファイルについて ls -al を行なった結果をファイル foo に保存したいのですが、どのようなシェルプログラムを作れば宜しいでしょうか? awk/sed も使える環境ですので、これらを使ったスクリプトでも構いません。 非常に初歩的な質問で申し訳ありませんが、宜しくお願いします。

  • シェルでファイルの最下行を削除する方法

    シェルでファイルの最下行を削除する方法 シェルで、ファイルaaa.txtの最下行を削除したいです。これを1行で実現したいです。 exには-cってオプションがあるので、ex -c '$d' aaa.txt などと試してみましたがダメでした。 ;(コロン)や&&でつなぐのは、1行ではないって事でお願いします。 >cp aaa.txt tmp && sed '$d' tmp >aaa && rm tmp #こういうのは無しって意味です。 事前にスクリプトや、それ専用のバイナリを用意しておくのも無しでお願いします。なるべく汎用的な どこのUNIXにでもあるようなコマンドで実現したいです。

  • 複数ファイルを1つにするシェルスクリプト

    file.1 file.2 ..... file.xx とxxが連番になっている複数のテキストファイルがあります。 これを1つのファイル"file.all"にするために以下のシェルスクリプトを作ってみました。 (公開するのも恥ずかしいのですが...^ ^;) #!/bin/sh i=1 while [ $i -le 99 ]; do  cat file.$i >> file.all  let i=i+1 done これだと99までのファイルしか指定できません。 99999...とループ回数を増やせばいいのですが、 それよりももっとスマートにやる方法があるのではと思い質問を投稿いたしました。 シェルスクリプトではなくコマンドによる方法でも結構です。 (RH7.3を使っています) よろしくお願いします。

  • expectでfor文のあるシェルファイルの記述について

    expect を使用しているAシェル内で、Bシェルを実行しています。(成功しています。) が、作成されたファイルのユーザを揃えたいため、 Aシェル内にBシェルの内容を記述したいと思っています。 Aシェルファイルでのfor文の記述と、 変数を受け取る方法がわからないため、エラーになってしまっています。 expect文内のfor文の記述と変数の受け取り方などおしえてください。 よろしくお願いいたします。 ------------------Aシェルファイル--------------------- #!/bin/sh set timeout -1 spawn su - ユーザ名 set prompt ".*ユーザ名.*" sleep 1 expect "Password:" send "パスワード\n" expect -re $prompt sleep 1 send "/パス/rename.sh\n" expect -re $prompt send "echo /var/www/html/パス/tokyo/*/*.jpg | xargs /usr/bin/mogrify -resize 500x -quality 100\n" expect -re $prompt send "exit\n" --------------------------------------- ------------------Bシェルファイル--------------------- #!/bin/sh declare -i i=1 for dirlist in `ls -l /var/www/html/パス/tokyo/ | awk '$1 ~ /d/ {print $9 }' ` do rm -rf /var/www/html/パス/$dirlist/small mkdir /var/www/html/パス/$dirlist/small done ---------------------------------------

  • Kシェルでファイル削除処理

    kシェルで、ファイルを1行ずつ読み込み、記述されたファイルを削除する処理を作成したいのですが、ワイルドカード指定にも対応したいです。最初はrm -r で実施しようとしたのですが、これだとディレクトリも削除されてしまうので使えませんでした。rm -fでやった場合も削除に失敗した場合のエラーハンドリングが難しく困っています・・・。 何か良い方法はないでしょうか? lsコマンドの出力結果を再度読み込み、ファイルだったら消すという方法ぐらいしか思い浮かばず・・・。