1

В определенной папке слишком много файлов [*]. Я хотел бы переместить некоторые из них в подпапку. Как я могу:

  • переместить первые 3000 файлов или папок в другую папку, или
  • переместить файлы старше 3 месяцев в другую папку?

Спасибо

  • http://www.google.com/search?hl=&q=Errno%3A%3AEMLINK)+“Too+many+links&

4 ответа4

1

Как бы я изменил ответ Денниса Уильямсона:

find . -maxdepth 1 -type f -mtime +30 | rsync -nav --remove-source-files --files-from=- . archive/.

для тестирования и

find . -maxdepth 1 -type f -mtime +30 | rsync  -av --remove-source-files --files-from=- . archive/.

по настоящему.

Использование rsync вместо mv только потому, что rsync поддерживает указание своих исходных файлов при стандартном вводе. Но дополнительным преимуществом является то, что rsync имеет множество опций для детального контроля, например, работа с символическими ссылками.

1

Безусловно, самый простой способ - использовать Zsh. Чтобы переместить первые 3000 файлов в текущем каталоге в /other/directory:

mv *([1,3000]) /other/directory

Если вы создали несколько подкаталогов, которые хотите исключить из этой команды:

setopt extended_glob
mv *([1,3000])~(exclude-me|exclude-me-too) /other/directory

Чтобы переместить файлы старше 3 месяцев (первое m означает «время модификации», а второе m означает месяцы; дробные части игнорируются, поэтому +2 означает ≥3):

mv *(mm+2) /other/directory

Если вы предпочитаете использовать сложные команды, а не запускать другую оболочку, это все же разумные строки с GNU find:

find -mindepth 1 -maxdepth 1 -print0 | head -n 3000 | xargs -0 -i mv {} /other/directory
find -mindepth 1 -maxdepth 1 -mtime +91 -print0 | xargs -0 -i mv {} /other/directory
1

Команда find должна помочь с небольшими скриптами над ней.

Некоторые ссылки,

  1. Учебное пособие по команде "найти" для Unix/Linux
  2. Linux найти примеры команд
  3. Интерфейс командной строки Ninja Howto

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

1

Подобный скрипт должен работать для перемещения первых файлов NUMBER_OF_FILES в SUBDIRECTORY:

NUMBER_OF_FILES=3000  
SUBDIRECTORY=target_folder_name  
NUM=0

find . -type f -maxdepth 1 | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
NUM=`expr $NUM + 1`  
if [ $NUM -le $NUMBER_OF_FILES ]  
then  
mv $FILENAME $SUBDIRECTORY  
fi  
done  
rm /tmp/$$ 

Примерно так для измененных 90 дней назад или более:

NUMBER_OF_DAYS=90  
SUBDIRECTORY=target_folder_name  

find . -type f -maxdepth 1 -mtime +$NUMBER_OF_DAYS | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
mv $FILENAME $SUBDIRECTORY  
done  
rm /tmp/$$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .