0

いくつかのdirをある場所から別の場所に移動しようとしていますが、1つをそのままにしておく必要があります(すべてのファイルはそのまま残ります)。私はいくつかのことを試しましたが、何もうまくいかないようです。DIR_COUNTの値をテストしましたが、期待どおりに機能します。ただし、条件ステートメントまたはcaseステートメントで使用すると、期待どおりに機能しません。

条件付き

#!/bin/bash
DIR_COUNT=$(find path/to/dir/*[^this_dir_stays_put] -type d -maxdepth 0 | wc -l)
echo $DIR_COUNT
if [[ $DIR_COUNT > 0 ]]
  then
    find path/to/dir/*[^this_dir_stays_put] -type d -maxdepth 0 -exec mv {} new/location \;
    echo "Moving dirs."
  else
    echo "No dirs to move."
fi

場合

#!/bin/bash
DIR_COUNT=$(find path/to/dir/*[^this_dir_stays_put] -type d -maxdepth 0 | wc -l)
echo $DIR_COUNT
case $DIR_COUNT in
  0)
    echo "No dirs to move."
  *)
    echo "Moving dirs."
    find path/to/dir/*[^this_dir_stays_put] -type d -maxdepth 0 -exec mv {} new/location \;;;
esac

どちらのバージョンのコードでも、移動するディレクトリが存在すればすべて問題ありませんが、移動するディレクトリがない場合は問題が発生します。

条件付き

$ sh script.sh
find: find path/to/dir/*[^this_dir_stays_put]: No such file or directory
0
No dirs to move.

場合

$ sh script.sh
find: find path/to/dir/*[^this_dir_stays_put]: No such file or directory
0
Moving dirs.
find: find path/to/dir/*[^this_dir_stays_put]: No such file or directory
4

2 に答える 2

3

条件文とcase文をスキップします。

find path/to/dir/*  \! -name 'this_dir_stays_put' -type d -maxdepth 0 \
   -exec mv {} new/location \;
于 2012-11-11T05:35:34.460 に答える
0

私はあなたがこのようなものを持っていると仮定しています:

dir_a
dir_b
dir_c
dir_d
dir_e

を除くすべてのディレクトリを移動しますdir_c

場合によっては、すべてのディレクトリを新しい場所に移動してから、必要なディレクトリを元に戻すのが最も簡単な方法です。いいえ?

さて、あなたがそれを使うなら、Kornshellそれはかなり簡単です。を使用する場合は、最初に次のようなオプションをBash設定する必要があります。extglob

$ shopt -s extglob

これで、拡張グロブ構文を使用してディレクトリ例外を指定できます。

$ mv !(dir_c) $new_location

!(dir_c)を除くすべてのファイルに一致しますdir_c。これはKornshellで機能します。これはBASHで機能しますが、最初に設定した場合に限りますextglob

于 2012-11-11T05:37:09.073 に答える