Що не вистачає аргументу -exec?


15

Я використовую наступну команду, щоб очистити каталог, файли та каталоги старше 30 днів, і переміщу їх до каталогу архівів, який я можу видалити через кілька тижнів, якщо ніхто не вимагає повернення їх файлів. Цільовий каталог має підкаталоги за іменем користувача, як і каталог архівів.

Це команда, яку я використовую:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Я запропонував модифіковану версію цього , щоб відповісти на питання про те, запитати Убунту, інший користувач редагує код , щоб змінити кінець рядка \;для , +як це швидше (і правильніше?). Дивіться тут

Однак використання +цього способу працює, якщо -execкоманда є, ls -lhале не є фактичною командою, яку я використовую. Якщо я спробую це, +я отримаю повідомлення про помилку:

find: missing argument to '-exec'

Я не розумію, чому так поводиться, чи якою була б правильна команда. Будь ласка, не просто публікуйте корекцію команди, я хотів би зрозуміти, а не просто сліпо виконувати пропозицію.


Ви посилаєтесь на цю відповідь ? Це може пояснити, чому
Вільф

Дякую @Wilf я оновив, щоб показати, на яку відповідь відбулося редагування. Надане вами посилання має ще одне посилання, яке пояснює це таким чином, з яким мій мозок може впоратися.
Арронічний


Дякую @souravc у блискуче циклічному манері, це запитання до користувача, який редагував мою команду! Нарешті, я отримую, що вона +подає кілька аргументів до однієї команди, але mvне впорається з цим!
Арронічний

@Arronical mv can, дивіться мою відповідь ^^
хаос

Відповіді:


19

Користувач у цій публікації може сказати, що +знак в кінці -execкоманди швидше, але не чому.

Давайте припустимо, що findкоманда повертає такі файли:

/path/to/file1
/path/to/file2
/path/to/file3

Звичайна -execкоманда ( -exec command {} \;) виконується один раз для кожного відповідного файлу. Наприклад:

find ... -exec mv {} /target/ \;

Виконує:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Якщо ви використовуєте +знак ( -exec command {} +), команда будується шляхом додавання декількох відповідних файлів у кінці команди. Наприклад:

find ... -exec mv -t /target/ {} +

Виконує:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Щоб +правильно використати прапор, аргумент для обробки повинен бути в кінці команди, а не в середині. Ось чому findтають missing argument to '-exec'у вашому прикладі; це пропускає закриття {}.


Мені завжди було цікаво, чому find -execпотрібен {}останній аргумент при використанні з +. Хтось знає, чому було прийнято таке проектне рішення, а не дозволяти таким конструкціям, як командний рядок ОП?
Пітер Кордес

11

Користувач пояснив їх редагування ....

'+' термінатор exec швидше, ніж '\;'  див. /ubuntu/558817/what-is-the-difference-bet between-using-and-in-exec-command;  і створити файл резервного копіювання з оригінального файлу - хороша ідея

... за допомогою цього посилання . Я думаю, що в основному замість того, щоб використовувати кілька команд, він надсилає всі імена файлів в один екземпляр команди, щоб прискорити роботу. Ось приклад звідси :

Використання -exec з крапкою з комою ( find . -exec ls '{}' \;), буде виконано

ls file1
ls file2
ls file3

Але якщо ви використовуєте знак плюс замість ( find . -exec ls '{}' \+), всі назви файлів будуть передані як аргументи до однієї команди:

ls file1 file2 file3

Існують і інші форми, які використовуються ;і +як ( звідси :)

Тому для команди find дозволений наступний приклад синтаксису:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

ЯКЩО я не впевнений, що це все одно буде працювати з командою переміщення, оскільки це синтаксис mv [OPTION]... SOURCE DEST, якщо не використовується -tваріант чи подібне. Однак він повинен працювати lsбез додаткових опцій тощо, оскільки вони можуть зрозуміти, коли надано кілька імен файлів. +Також потрібно екранувати (тобто \+)


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