Сценарий 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) чтобы определить

  1. Если запись является файлом или каталогом, как уже было предложено выше, markp-fuso Используйте if-else для проверки

  2. Как только станет очевидно, что запись является файлом, запустите требуемый moveкоманда или copyКоманда, если вы хотите сохранить исходный файл. Это исполнение может быть добавлено как вложенное ifили вызывается в функции.

Другие вопросы по тегам