0

「lock」という名前のファイルの存在に応じて、追加情報、つまり LOCKED または FREE ステータスを含むディレクトリを一覧表示したいと考えています。

例: - "dir" という名前のメイン ディレクトリがあります。 - そのディレクトリには "dir1"、"dir2"、"dir3" というサブディレクトリがあります。 - "dir2" にはファイル "lock" が含まれています。そのようなファイル名 - 結果のリストを次のようにしたい:

dir1 - FREE
dir2 - LOCKED
dir3 - FREE

Bashでそれを行う方法は?

4

3 に答える 3

2

これはうまくいくはずです:

for i in *  #loop through current directory
do
if [ -d "$i" ] #if you see a directory
then
 cd "$i";  #go in
 echo -n "$i "
 if [ -f "lock" ] #see if the file is there
 then
 echo "Locked"
 else
 echo  "Free" 
 fi
 cd ..
fi
done

これを親ディレクトリで実行する必要があります(dirあなたの場合はそう思います)

サンプルラン:

aman@aman-VPCEB14EN:~/test$ ls -R
.:
dir1 dir2 dir3 dir4 dir5 try.sh

./dir1:

./dir2:
ロック

./dir3:

./dir4:

./dir5:
ロック
aman@aman-VPCEB14EN:~/test$ ./try.sh
dir1 フリー
dir2 ロック
dir3 無料
dir4 無料
dir5 ロック
于 2012-12-14T10:29:34.203 に答える
2

このスクリプトは、引数としてディレクトリ名を受け取り、1 レベル下のディレクトリのロック ステータス (定義に従って) を出力します。

#!/bin/bash
find $1 -mindepth 1 -maxdepth 1 -type d -print0 | while read -r -d '' dirname
do
  [[ -f "$dirname/lock" ]] && STATUS="LOCKED" || STATUS="FREE"
  echo "${dirname#$1} - $STATUS"
done

使用例:

[me@home]$ ls -R dir/
dir/:
dir1  dir2  dir3  dir with spaces

dir/dir1:

dir/dir2:
lock

dir/dir3:

dir/dir with spaces:

[me@home]$ ./status_check.sh dir/
dir1 - FREE
dir with spaces - FREE
dir2 - LOCKED
dir3 - FREE

PS find-while イディオムの (不必要に複雑に見える) 使用法により、スペースを含むファイル名でスクリプトが壊れないようになります。これこれを参照してください。

于 2012-12-14T11:07:44.010 に答える
1

そして今、シンプルなワンライナー:

for DIR in */ ; do echo -n "$DIR - " ; ls "${DIR}lock" >/dev/null 2>&1 && echo LOCKED || echo FREE ; done

あなた*/だけでディレクトリを取得します。echo -n末尾の改行を省略しているため、ディレクトリ名を出力するだけです。次に、各ディレクトリ内でファイルを探しlock、lsの出力(有効なものとエラーの両方)を破棄します。lsが成功した場合は、無料でエコーします。それ以外の場合は、LOCKEDをエコーし​​ます。終わり。

于 2012-12-14T11:45:17.933 に答える