як перемістити багато папок в підпапку в linux?


1

У певній папці занадто багато файлів [*]. Я хотів би перенести деякі з них у підпапку. Як я можу:

  • перемістити перші 3000 файлів або папок в іншу папку або
  • переміщати файли старше 3 місяців в іншу папку?

Дякую

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

Відповіді:


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

The find команда повинна допомогти з деякими незначними сценаріями над ним.

Деякі посилання,

  1. Unix / Linux "Знайти" Command Tutorial
  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/$$

Тимчасовий файл і додатковий дескриптор файлів є непотрібними, якщо ви просто пропускаєте find в while read. Крім того, змінні, що містять імена файлів, повинні бути процитовані і кодуватись в межах циклів і if оператори повинні мати відступ (я коду відформатував ваш код).
Dennis Williamson

Крім того, жорсткі параметри погані.
reinierpost

А також темпфайли.
reinierpost

І сорт зайвий.
reinierpost

Дякуємо за відгук про сценарій. У цьому випадку висновок пошуку може бути переданий в певний час. Тим не менш, я був спалений цим при використанні деяких оболонок, які породжують суб-оболонку, коли трубопроводи команд разом, викликаючи будь-які зміни змінних в циклі, які будуть втрачені, коли він виходить. Наприклад, якщо бажано кількість файлів, а змінна лічильника збільшується в межах циклу, використовуючи технологію трубопроводів, ця змінна повернеться до початкового значення після закінчення циклу і втратить значення підрахунку. Метод tempfile вище дозволяє уникнути цього.
E Brown

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 має безліч опцій для детального контролю, наприклад, справу з символічними посиланнями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.