Потому что !
- зарезервированное слово в bash.
Чаще всего используется для отрицания данных и для доступа к последней команде, но ее можно использовать для нескольких разных вещей, поэтому лучший совет - проверить страницу руководства и использовать одинарные кавычки (например, '
) вокруг строк, которые не нуждаются в расширении.
Вы можете использовать сопоставление по образцу:
cp /media/src/[[:lower:]][[:lower:]]_[[:lower:]][[:lower:]] /media/dest/
[[:lower:]]]
- это определенный POSIX класс символов, который соответствует всем символам, классифицированным как строчные буквы.
Edit: Для соответствия всем символам используйте класс символов альфа
вместо нижний
:
cp /media/src/[[:alpha:]][[:alpha:]]_[[:alpha:]][[:alpha:]] /media/dest/
Пожалуйста, проверьте, хотите ли вы этого. Он ищет каталоги в формате xx_yy / ab_cd / && _ $$ (2char_2char) и копирует содержимое в новый каталог.
usage : ./script.sh
cat script.sh
#!/bin/bash
MYDIR="/media/src/"
NEWDIRPATH="/media/dest"
DIRS=`ls -l $MYDIR | grep "^d" | awk '{print $9}'`
for DIR in $DIRS
do
total_characters=`echo $DIR | wc -m`
if [ $total_characters -eq 6 ]; then
has_underscore=`echo "$DIR" | grep "_"`
if [ "$has_underscore" != "" ]; then
echo "${DIR}"
start_string_count=`echo $DIR | awk -F '_' '{print $1}' | wc -m`
end_string_count=`echo $DIR | awk -F '_' '{print $2}' | wc -m`
echo "start_string_count => $start_string_count ; end_string_count => $end_string_count"
if [ $start_string_count -eq 3 ] && [ $end_string_count -eq 3 ]; then
cp -r $DIR $NEWDIRPATH/
fi
fi
fi
done