Вы, по сути, признали, что это домашнее задание. и не имеет отношения к реальной жизни. Как было написано в комментариях, ваш учитель, вероятно, хочет, чтобы вы сделали
for filename in $(ls "$1" | grep -v '\.old$')
Если ваш учитель чрезвычайно глуп, непросветлен, они могут предпочесть, чтобы вы опустили кавычки \
и $
. Пожалуйста, познакомьте своего учителя с Unix & Linux Stack Exchange . Но если ваш учитель не может или не хочет научиться делать что-то правильно, затем делать домашнее задание так, как они хотят.
Тогда немедленно забудь об этом, потому что оно ошибочно.
Вот вариант ответа Кусалананды это может быть немного легче читать. (Я добавил проверку ошибок, потому что это правильно ™.)
if [ "$1" = "" ]
then
printf 'Usage: %s \n' "$0"
exit 1
fi
if [ ! -d "$1" ]
then
printf 'Error: %s is not a directory.\n' "$1"
exit 2
fi
for filename in "$1"/*
do
case "$filename" in
(*.old) # Skip
;;
(*)
mv -- "$filename" "$filename.old"
esac
done
Вы также можете
$1
является каталогом, но либо Из вашей структуры в ожидаемом результате вы просто хотите сохранить файлы, которые не заканчиваются на .json
. Это сделает:
cd Photos
find. -type f ! -name *.json -exec mv {}. \; && rm -rf 2015*
Внутри каталога Photos вы найдете файлы, которые не заканчиваются на .json
, переместите их в .
или текущий каталог, а затем удалите подкаталоги и файлы внутри, которые вам не нужны.. Вы также можете использовать rm -ri 2015*
, чтобы он запрашивал вас перед удалением каждого каталога, или запускать команды find
и rm
отдельно на случай, если вы передумаете перед удалением остальных файлов и их каталогов.