ディレクトリ以外の項目を削除するときにプロンプ​​トを表示する

ディレクトリ以外の項目を削除するときにプロンプ​​トを表示する

.txtファイルを含む空でないディレクトリを削除しようとしたときにプロンプ​​トを表示したいと思いますrmdir。可能ですか?

答え1

@Praveen J Kumar、よく分からないので基本だけを扱うようにします。ここには4つの状況があります。

  1. あなたするディレクトリを削除するときにメッセージを表示したいです。-iフラグは対話型セッション用であり、各ファイルを削除する前に尋ねます。-r再帰のために、つまりディレクトリ全体とサブディレクトリなどを巡回する場合は、次のようにします。

    $ rm -ri <directory path>
    
  2. あなたいいえディレクトリの削除時にメッセージを表示するには、次のようにします。

    $ rm -r <directory path>
    
  3. 欲しいディレクトリから特定の種類のファイルのみを削除する。これを行うには、出力でフォーマットされていないすべてのファイルを選択するls -1入力行を提供する次の行を使用できます(ここでフラグは大文字と小文字を区別せず、「jpg」文字列を除くすべての項目に適用されます。)たとえば、次を除くディレクトリ内のすべてのファイルを削除したいと思います。 grep -iv "jpg"lsjpg-i-vxargs rmrmgrepjpg

    $ ls -1
    one.txt
    three.jpg
    three.csv
    three.sh
    two.txt
    $ ls -1 | grep -iv "jpg" | xargs rm
    $ ls
    three.jpg
    
  4. rmdir空でないディレクトリはデフォルトで削除されないので大丈夫です:-).

最後の注意:フラグを選択したときに-iディレクトリにファイルが多い場合は、各ファイルのメッセージが表示され、退屈する可能性があります。

答え2

ディレクトリの削除を確認したい場合は、コマンドと同じフラグを提供しませrmdirん。ただし、空のディレクトリで作業している場合は終了コードを返します。たとえば、-irmrmdir0

$ mkdir emptydir && rmdir emptydir && echo $?
0

ご覧のとおり、空のディレクトリを削除するときに確認を要求しません。検証メカニズムを構築する唯一の方法は、rmdirラッパーと呼ばれるものを作成することですrmemptydir。私は2つの異なるアプローチを示すために2つのバージョンを書きました。

好む方法

#!/bin/bash

    [[ $# = 0 ]] &&  printf '%s\n' "rmdir [dirname]" exit 1
     shopt -s nullglob dotglob
    files=( ${1+"$1/"}* )
    (( ${#files[*]} )) || { rm -ri "$1" && exit 1; } && printf '%s\n' "Dir not empty" 
    shopt -u nullglob dotglob

1)スクリプトはディレクトリ名である1つのパラメータを受け入れます。パラメータが指定されていない場合は終了

2) 位置パラメータ$1格納ディレクトリ(要素を含む配列)

3) 配列の要素数を確認し、そうでない場合は else 実行0に移動すると完了します。printf '%s\n' "Dir not empty"rm -ri "$1" && exit 1

スタックのディレクトリとスタックのディレクトリにおよびをpushd使用することを除いて、2番目のアプローチにも同じことが当てはまります。popdpushpop

内部的にどのように機能するのだろうか?

set -xすぐ下とすぐ後ろに配置して#!/bin/bash 取り外します。>/dev/nullpushdpopd

2番目の方法は以下を使用しますpushdpopd

#!/bin/bash

 if [[ $# = 0 ]]; then
    printf '%s\n' "rmdir [dirname]" 
    exit 1
 fi
 shopt -s nullglob dotglob
  pushd "$1" >/dev/null
  files=(*)
  (( ${#files[*]} )) || { popd >/dev/null && rm -ri "$1" && exit 0 ;} && printf '%s\n' "Dir not empty" 
  shopt -u nullglob dotglob

rmdir空のディレクトリのみを削除でき、ディレクトリmusic.mp3に1つあるため、次のことは機能しません。

mkdir emptydir && touch emptydir/music.mp3 && rmdir emptydir && echo $?
rmdir: failed to remove ‘emptydir’: Directory not empty

関連情報