Сценарий Bash / Shell для изменения файлов в папках и подпапках, но НЕ для изменения имен папок
Итак, у меня есть скрипт, который просматривает файлы в папке и переименовывает их в нечетные и четные числа.
Моя проблема в том, что у меня есть много подпапок, и он переименовывает их, когда я не хочу изменять имена папок, но я хочу изменять файлы внутри подпапок.
Как я могу этого добиться?
#!/bin/bash
export FILE_PATH="/path1/path2/path3/"
export even=0
export odd=-1
for file in /path1/path2/path3/*; do
mv "$file" $FILE_PATH$(echo "$file" | sed -e 's/[^A-Za-z0-9.]/_/g');
done
for f in /path1/path2/path3/*; do
sum=$(sha1sum "$f" | awk '{print $1}');
if [[ "$sum" != 3c72363260a32992c3ab2e3a5e9b8cf082e02b2c ]]; then
even=$((even+2));
echo $FILE_PATH"even_"$even".mp4";
mv "$f" $FILE_PATH""$even".mp4";
else
odd=$((odd+2));
echo $FILE_PATH"odd_"$odd".mp4";
mv "$f" $FILE_PATH""$odd".mp4";
fi;
done
В настоящее время мой макет каталога таков.
/path1/path2/path3/random_folder_name/20.mp4
Но скрипт продолжает выводить это.
/path1/path2/path3/1/20.mp4
И я не хочу, чтобы мой путь к папке был изменен только внутри переименованного mp4.
2 ответа
В каждом из циклов первое, что вы можете сделать, это проверить, действительно ли рассматриваемый файл является файлом или каталогом, и реагировать соответствующим образом, например:
for file in /path1/path2/path3/*; do
[[ -d "${file}" ]] && continue # if it's a directory then skip to next pass through for loop
mv "$file" ...
... snip ...
done
# and
for f in /path1/path2/path3/*; do # if it's a directory then skip to next pass through for loop
[[ -d "${f}" ]] && continue
sum= ...
... snip ...
done
ПРИМЕЧАНИЕ. Я бы посоветовал просмотреть справочные страницы для
bash
для других тестов по мере необходимости (например, вам нужно беспокоиться о символических ссылках? вам нужно беспокоиться об исполняемых файлах? вам нужно беспокоиться о двоичных файлах? и т. д.)
Что касается отдельного вопроса обработки файлов в подкаталоге... см. комментарий Nic3500 об использовании
find -type f ...
предоставить список файлов на всех уровнях каталогов; имейте в виду, что это потребует изменения вашего общего процесса (например, замена 2x
for
петли с одинарной
while
петля).
Недавно я написал скрипт для клиента для поиска шаблонов в папке [ не подпапках ] и соответственно их изменения, используя
find
.
Вы можете искать файлы в нужном каталоге, установив
-maxdepth 1
. Я использовал:
find ${matPath} -maxdepth 1 -name "*.*" -mtime +30 | sort | rev | cut -d "/" -f 1 | rev > ${curPath}/list.txt
Когда у вас есть список в list.txt, вы можете запустить проверку каждой записи, используя
while
что я предпочитаю(
while IFS= read -r line
) чтобы определить
Если запись является файлом или каталогом, как уже было предложено выше, markp-fuso Используйте if-else для проверки
Как только станет очевидно, что запись является файлом, запустите требуемый
move
команда илиcopy
Команда, если вы хотите сохранить исходный файл. Это исполнение может быть добавлено как вложенноеif
или вызывается в функции.