2017-02-07 5 views
3

Идея этого кода состоит в том, чтобы найти все файлы в каталоге размером более 1 КБ (или 1000 байтов), сжать их и удалить из исходного каталога. Мне удалось выяснить обе отдельные команды, но я не уверен, как связать вывод с первой на вторую команды (если это имеет смысл)? Может кто-то указать мне верное направление?Как сжать файлы размером более определенного размера в каталоге?

# Initialize variables 
dir=~/Test 

# Change directory to $DIRECTORY 
cd "$dir" 

# Find all files in the current directory that are larger than 1000 bytes (1KB). 
find . -maxdepth 1 -type f -size +1000c | zip -mT backup 
+0

Также см. [Как найти файлы, большие или меньшие, чем x байт?] (Http://superuser.com/q/204564/173513) для суперпользователя. – jww

ответ

2

Я предусмотрел заглушку раньше, но решил исправить сценарий. Это все еще не будет обрабатывать патологические случаи, такие как имена файлов, содержащие подстановочные знаки.

#!/usr/bin/bash 
# the following line handles filenames with spaces 
IFS=' 
' 
backupfilename=backup; 

for file in $(find . -maxdepth 1 -type f -size +1000c) 
do 
    if zip ${backupfilename} -u "${file}" # test that zip succeeded 
    then 
    echo "added file ${file} to zip archive ${backupfilename}" 1>&2; 
    # add your remove command here; remember to use quotes "${filename}" 
    echo "file ${file} has been deleted" 1>&2; 
    fi 
done 

Единственное, что я упустил, это команда delete. Вы должны работать над этим и тщательно протестировать его, чтобы быть уверенным, что вы случайно не удаляете файлы, которые вы не хотите удалять.

+0

Выполняя это, вы также можете проверить, удалось ли выполнить команду архивирования перед удалением файла, который должен был быть добавлен в архив. –

+0

Это не удастся, если в каталоге есть файлы с пробелами или дикими картами в них - из-за разбиения и глобализации слова. – codeforester

+0

Чтобы обрабатывать имена файлов с пробелами, добавьте строку ... IFS = ' ' ... перед циклом for. Это говорит о том, что для разделения имен файлов используются только новые строки. Мне придется искать имена файлов с помощью подстановочных знаков. –

4

Используйте опцию -exec вместо того, чтобы трубы следующую команду:

find . -maxdepth 1 -type f -size +1000c -exec zip -mT backup {} \; 

создало бы zip архив, содержащий совпавшие файлы.

+0

Просмотрев страницу руководства для поиска, я должен был понять, что это вариант. Спасибо! Я получаю сообщение об ошибке, 'find: пути должны предшествовать выражению' - мой путь должен быть просто. (текущий каталог), который определенно предшествует выражению, поэтому любые идеи о том, почему это порождает эту ошибку? – IAspireToBeGladOS

+0

Похоже, что происходит некоторое расширение оболочки, как правило, эта ошибка возникает, если что-то (например, путь, переменная и т. Д.) Неправильно цитируется; существуют и другие причины, но нужны более конкретные детали ... –