У меня есть сценарий меню с множественным выбором, чтобы отобразить верхнее использование диска файловой системы. Это рабочий скрипт, но у меня проблема с одной из файловых систем с именем /data.
DATA_RAW_DISK_DUMP="/tmp/$(basename $0).$$.disk_raw_data"
DATA_RAW_FILE_LIST="/tmp/$(basename $0).$$.file_raw_data"
MY_WORKING_DIR=$(pwd)
MY_OUTPUT_FILE="MY_WORKING_DIR/$(basename $0).output"
#check existing output file
if [[ -e $MY_OUTPUT_FILE ]] ; then
if [[ -e ${MY_OUTPUT_FILE}.old ]] ; then
rm ${MY_OUTPUT_FILE}.old
fi
mv $MY_OUTPUT_FILE ${MY_OUTPUT_FILE}.old
fi
#will prompt for choices - ignore any arguments
echo "Please select from below:" cat<<EOF
1. /data
2. /data01
3. DO_ALL_DATA_AT_ONCE
Press ENTER to exit EOF
echo -n "Selection:"
read ans
if [[ $ans == "" ]] ; then
echo "Bye"
exit 0
fi
case $ans in
"1"|"2"|"3")
FS_TARGET="$ans"
;;
*)
echo "Unknown option - quitting"
echo "Bye"
exit 0
;;
esac
DATA="/data0${FS_TARGET}/*"
if [[ $FS_TARGET -eq 3 ]] ; then
#if the selection is 3, then we just do everything, in one go
DATA="/data/* /data01/*"
fi
#do the du first
echo "Running du for ${DATA}, this will take a while, please wait..." >&2
du -sk ${DATA} > $DATA_RAW_DISK_DUMP 2>/dev/null
#we need to check each entry, if its directory, go into it and get the youngest file
echo "Checking file age for ${DATA}, this will take a while, please wait..." >&2
for i in $(cat $DATA_RAW_DISK_DUMP | awk '{print $2}') ; do
if [[ -d $i ]] ; then
#we need to find the youngest file in this directory tree
YOUNGEST_FILE="$(find $i -type f -printf "%C@ %p\n" | sort -rn | head -n 1|sed 's,[0-9]*[.][0-9]*[ ],,g')"
if [[ $YOUNGEST_FILE == "${i}" ]] ; then
stat --format "%n;%Y;%X;%U" "$i" >> $DATA_RAW_FILE_LIST 2>/dev/null
elif [[ $YOUNGEST_FILE == "" ]] ; then
stat --format "%n;%Y;%X;%U" "$i" >> $DATA_RAW_FILE_LIST 2>/dev/null
else
stat --format "%n;%Y;%X;%U" "$YOUNGEST_FILE" >> $DATA_RAW_FILE_LIST 2>/dev/null
fi
else
stat --format "%n;%Y;%X;%U" "$i" >> $DATA_RAW_FILE_LIST 2>/dev/null
fi
done
Сценарий выше, варианты 2 и 3 будут работать нормально, но вариант 1 ничего не показывает. Затем я пытаюсь по-другому, добавив еще одну переменную в скрипт, и это не сработало. Может кто-нибудь показать мне, как заставить его читать мою файловую систему / данные?
echo "Please select from below:"
cat<<EOF
1. /data
2. /data01
3. DO_ALL_DATA_AT_ONCE
Press ENTER to exit
EOF
echo -n "Selection:"
read ans
if [[ $ans == "" ]] ; then
echo "Bye"
exit 0
fi
case $ans in
"1"|"2"|"3")
FS_TARGET="$ans"
;;
*)
echo "Unknown option - quitting"
echo "Bye"
exit 0
;;
esac
DATA="/data0${FS_TARGET}/*"
if [[ $FS_TARGET -eq 1 ]] ; then
#if the selection is 1, then change do the variable....
DATA="/data/*"
fi
if [[ $FS_TARGET -eq 3 ]] ; then
#if the selection is 3, then we just do everything, in one go
DATA="/data/* /data01/*"
fi