Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Преместване на файлове според датата.

Featured Replies

Здравейте,

Предварително ви се извинявам но Аз съм много зле със Linux-а като цяло.

Ситуацията - наследил съм Linux сървър. Той се ползва САМО за файлов сървър под Windows.

Има една шерната папка  в която по мрежата се записват и редактират разни файлове. Типа им е различен (doc, xls, pdf, cdr). В течение на времето са се натрупали десетки хиляди

(да не кажа стотици хиляди) файлове и вече бъркотията е огромна. Идеята ми е да преместя част от файловете в друга папка като запазя дървовидната структура. Тук критерия за

преместване искам да е дата и по точно еквивалента на Windows-ката Date accessed. Например папката в която в момента се намират файловете е"/home/user/Documents".

Искам всички файлове които не са "достъпвани"(Date accessed) преди 01.01.2023г да се преместят в папка  "/home/user/Old-Documents" като се запази дървовидната структура.

Ако останат празни папки допълнително ще го мисля.

Сървъра е само кутия без монитор клавиатура и мишка. До него имам пълен root достъп по SSH. Моля за помощ.

Благодаря предварително.

Разрешен от capnemo

Ето ви скрипт

for file in *; do
    [ ! -L "$file" ] &&
      dir_name=$(date -r "$file" +%Y) &&
      mkdir -p "$dir_name" &&
      mv -- "$file" "$dir_name"
done

 

Или чрез командата find

преди 3 часа, petie1 написа:

Ето ви скрипт

for file in *; do
    [ ! -L "$file" ] &&
      dir_name=$(date -r "$file" +%Y) &&
      mkdir -p "$dir_name" &&
      mv -- "$file" "$dir_name"
done

 

Или чрез командата find

Замислял ли се какво причини горния скрипт? Помисли...

преди 25 минути, MZ/X написа:

Замислял ли се какво причини горния скрипт? Помисли...

Леле вярно че съм слънчасял......... Ааа влизам си в хладилника пак

@johnpetp 

Предлагам ти да направиш операцията на части, за яснота и контрол.
 Приемам твоето именуване на директори - т.е. /home/user/Documents, ако е друго коригирай съответно.
 0. Дам точка нула - бекъп на тази Documents преди всякакви манипулации!!
 1. В директорията над Documents - /home/user създаваш критерия за местене - празен файл:

 $ touch -t 202301010001 stamp.txt


 2. От директория /home/user/Documents стартираш търсене по горния критерии за всички файлове по-стари от щампата:

 $ find . -type f ! -anewer ../stamp.txt > ../list.txt


 Получаваш /home/user/list.txt списък на всички файлове, които не са били достъпвани след датата по твоя критерий.
 3. Преместване на тези стари файлове в същата дървовидна структура, но в нова директория:
 Изпълняваш от директорията над Documents:

 $ rsync -aP  --remove-source-files --files-from=list.txt /home/user/Documents /home/user/Old-Documents --dry-run


 Махаш --dry-run като ти каже колко файла ще копира и вече наистина изпълняваш, бройката ще е по-голяма от тази в list.txt, защото включва и бройката на създаваните каскадно директории. 
 --remove-source-files ще ти изтрие таргетираните файлове в Documents СЛЕД КАТО ги премести в Old-Documents

Това е.

преди 17 минути, MZ/X написа:

 

...

 $ find . -type f ! -anewer ../stamp.txt > ../list.txt

...

И какво правим ако има файл с име в което има спейс, таб, нов ред?

Няма да има проблем, rsync ще премести този файл, за него терминаторът е краят на реда в списъка, а до там може да има всичко, йероглифи и контролни символи включително.

преди 2 минути, MZ/X написа:

Няма да има проблем, rsync ще премести този файл, за него терминаторът е краят на реда в списъка, а до там може да има всичко, йероглифи и контролни символи включително.

Дали? rsync прави списък с файловете, базиран на листа. И ако има примерно нов ред ще дефинира два файла за синхронизиране (с двете части на името)

не е така, на всеки ред има точно 1 файл и така се обработва.
провери лично, щом не вярваш

между другото, за първи път чувам да има в името на файл нов ред?! 
Тази екзотика, признавам, не съм я срещал,

преди 3 минути, MZ/X написа:

не е така, на всеки ред има точно 1 файл и така се обработва.
провери лично, щом не вярваш

между другото, за първи път чувам да има в името на файл нов ред?! 
Тази екзотика, признавам, не съм я срещал,

Не е задължително. И това че не сте виждал нещо не означава че го няма и че не се среща. В практиката ми съм виждал всякакви странности.

преди 1 минута, capnemo написа:

Не е задължително. И това че не сте виждал нещо не означава че го няма и че не се среща. В практиката ми съм виждал всякакви странности.

Не смяташ ли, че издребняваш? Какво всъщност целиш със заяждането? Разписаният алгоритъм работи.
Даже и да има някакъв изключителен случай с име на файл и да не може да се премести от rsync - той ще си остане там в оригиналната директория, а последваща генерация на stamp.txt ще го докаже.
 

 

  • Решение
преди 1 минута, MZ/X написа:

Не смяташ ли, че издребняваш? Какво всъщност целиш със заяждането? Разписаният алгоритъм работи.
Даже и да има някакъв изключителен случай с име на файл и да не може да се премести от rsync - той ще си остане там в оригиналната директория, а последваща генерация на stamp.txt ще го докаже.
 

 

Когато предлагате на другите код трябва да се грижите за изключенията.. Иначе и един индиец или AI може да напише горното. Но да осмислите нещата и да се погрижите за възможни проблеми - това е професионализъм (който вие не показвате)

преди 5 минути, capnemo написа:

Когато предлагате на другите код трябва да се грижите за изключенията.. Иначе и един индиец или AI може да напише горното. Но да осмислите нещата и да се погрижите за възможни проблеми - това е професионализъм (който вие не показвате)

погрижил съм се чрез генерацията на list.txt

Айде да ви замоля Вие да разпишете Вашия алгоритъм, да видя Вашия професионализъм

Оставям ви време до утре сутринта, ако не го направите - значи сте ... индиец 😀

  • Автор

Колеги, Благодаря ви за отговорите и идеите.

преди 12 часа, MZ/X написа:

0. Дам точка нула - бекъп на тази Documents преди всякакви манипулации!!

Това дори не е точка 0, а си е направо -1 😀

Освен това преди да пристъпя към действие с основното съдържание ще си направя нещо като опитна постановка за да тествам.

Основните действия поради големите размери и брой на файловете ще се случат нещо съботно-неделно когато съм сигурен в тестовете.

  • Автор

Здравейте отново Колеги,

През миналите събота и неделя имах възможност да тествам идеите на MZ/X. Е не върху истинските файлове, а в/у една достатъчно добра "извадка" от около 10000 файла.

Нещата се случват ТОЧНО според сценария на MZ/X. Има една лека подробност която не е много по вкуса ми. Вече преместените файлове получават Date accessed датата на преместването(демек вчера).

Това като се замисля е логично да е така. Но питането ми е имали някаква възможност при преместването да се запази оригиналната Date accessed. В момента дова че не се запазва оригиналната Date accessed

не ми пречи и ще си свърша конкретната работа, но някъкси ми се иска да се запази оригиналната информация за Date accessed.

Благодаря предварително

добави параметър -U в rsync в 3та стъпка
-U             preserve access (use) times

 $ rsync -aPU  --remove-source-files --files-from=list.txt /home/user/Documents /home/user/Old-Documents --dry-run

 

  • Автор

Добавих. За съжаление дава: rsync: -aPU: unknown option

По аналогия пробвах с малко "u" но се оказва че е за нещо съвсем ралично.

Разбрах насоката и ще пробвам сам да си помогна.

П.С. Това е само в/у "опитната постановка"

Явно си със стара версия на rsync
 --atimes, -U  preserve access (use) times
се появява в rsync ver 3.2.0 - 2020 година

Можеш евентуално да си компилираш последната 3.3.0 версия от сорс:
https://github.com/RsyncProject/rsync/releases/tag/v3.3.0

  • Автор

Явно.

Сега виждам че не съм казал от кога е въпросния комп.. Доколкото знам той е в употреба от 2019г. и очевидно няма как да е с версия на rsync  от 2020г.

Ще видя дали може да се ъпдейтне версията, но ако нещата тръгнат да се усложняват ще се задоволя със сегашния резултат.

преди 15 минути, johnpetp написа:

Явно.

Сега виждам че не съм казал от кога е въпросния комп.. Доколкото знам той е в употреба от 2019г. и очевидно няма как да е с версия на rsync  от 2020г.

Ще видя дали може да се ъпдейтне версията, но ако нещата тръгнат да се усложняват ще се задоволя със сегашния резултат.

А с кое дистро е знаеш ли?

Може да опиташ да видиш дистрото с това

lsb_release -a
	

 

  • Автор

Понеже не мога веднага да се занимавам с този "проблем" днес намерих време и ще докладва.

С две думи - Пълен Успех

преди 23 часа, petie1 написа:

А с кое дистро е знаеш ли?

Дистрибуцията е специализирана https://www.nethserver.org/  и както се вижда е базирана на CentOS и работи с RPM пакети.

Та намерих RPM пакет за версия rsync ver 3.2.3 и ъпдейтнах до тази версия. И тук вече има опция -U и всичко работи.

Сега следващите събота и неделя ще поекспериментирам да си изясня разни варианти и ще чакаме вече одобрението на "Голямото  Началство" за истинската вече операция.

Та още веднъж Благодаря Много!

Регистрирайте се или влезете в профила си за да коментирате

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.