Bash -перебирает указанные папки в поисках пустых файлов

Эта команда должна делать то, что вы ожидаете:

find "/media/sergio/Seagate Expansion Drive/DOWNS/Spring Framework 5" -type f \! -iname '*.mp4' -execdir mkdir -p rest \; -execdir mv "{}" rest/  \;

В этой команде:

  • -type f:сопоставлять только файлы (избегать перемещения каталогов, символических ссылок или специальных файлов)

  • \!:действовать как логическое «НЕ»

  • -iname:выберите файлы, совпадающие по имени, без учета регистра (Используйте -name, если вы хотите, чтобы они соответствовали регистру)

  • -execdir:запускает команду из подкаталога, содержащего соответствующий файл. Их нам нужно две, одна для создания папки rest/, а вторая для перемещения в нее файла.

отредактировать :добавить отсутствующий интерлиньяж \;, использовать execdirи оставить только одно решение.

0
13.12.2020, 04:27
4 ответа

Повторять не нужно,

array=("folderA" "folderX")
find "${array[@]}" -maxdepth 1 -type f -empty
2
18.03.2021, 22:43

./"${array[@]}"/* расширяется до:

./folderA folderB/*

, потому что ./идет в начало первого элемента, а /*идет в конец второго.

Что вам нужно сделать, так это добавить / *к каждому элементу массива, чтобы добавить суффикс:

"${array[@]/%//*}"

Вы можете выполнить поиск ${var/%Pattern/Replacement} здесь для получения дополнительной информации и узнать, как также добавить «./» в начало (, хотя для вашего конкретного случая указано выше замены достаточно ).

1
18.03.2021, 22:43

Альтернативное простое решение:

for i in "folderA" "folderX"
  do find "$i" -type f -empty
done

Обязательно укажите путь с именем папки, например «/usr/local», если сценарий запускается из другого места.

Редактировать :Кроме того, как правильно указано, если вы хотите ограничить область поиска, используйте ее с максимальной глубиной соответственно:

for i in "folderA" "folderX"
  do find "$i" -maxdepth 1 -type f -empty
done
2
18.03.2021, 22:43

Возможно, это поможет вам получить ожидаемый результат

#!/bin/bash

arr=("folderA" "folderX")    # Storing folder names to an array 
arr_count=${#arr[@]}     # Stroing count of element's in an array 
echo "Count of array :  $arr_count" # Printing the count of elements present in an array 

for ((  i=0 ; i<2 ; i++ ))
{
   find "$(pwd)"/"${arr[$i]}" -empty -type f 
}

Если вы хотите удалить этот пустой файл, просто добавьте это -deleteк приведенной выше команде поиска

find "$(pwd)"/"${arr[$i]}" -empty -type f -delete
1
18.03.2021, 22:43

Теги

Похожие вопросы