Список аргументів занадто довга помилка для команд rm, cp, mv


629

У мене є кілька сотень PDF-файлів під каталогом в UNIX. Назви PDF-файлів дійсно довгі (приблизно 60 символів).

Коли я намагаюся видалити всі PDF-файли разом за допомогою наступної команди:

rm -f *.pdf

Я отримую таку помилку:

/bin/rm: cannot execute [Argument list too long]

Яке рішення цієї помилки? Чи виникає ця помилка для mvі cpкоманди, а? Якщо так, то як вирішити ці команди?


21
Можливо, ця посилання
— стане вам


1
Також це може бути доречно http://mywiki.wooledge.org/BashFAQ/095
— Лоренцо Беллі

4
@jww: І я продовжував думати стільки років, що bash підпадає під "програмні засоби, які зазвичай використовуються програмістами" - категорія, питання якої можна задати тут!
— Вікі

@Nik - Додавання "... у сценарії" не є переконливим. Коли проблема зводиться до прикладу Мінімальний, Повний та Перевірений , це лише питання про те, як запустити команду. Мої вибачення, якщо я пропускаю щось очевидне.
— jww

Відповіді:


876

Причина цього відбувається в тому, що bash фактично розширює зірочку до кожного відповідного файлу, створюючи дуже довгий командний рядок.

Спробуйте це:

find . -name "*.pdf" -print0 | xargs -0 rm

Попередження: це рекурсивний пошук і знайде (і видалить) файли також у підкаталогах. Дотримуйтесь -fкоманди rm, лише якщо ви впевнені, що не хочете підтвердження.

Ви можете зробити наступне, щоб зробити команду нерекурсивною:

find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm

Інший варіант - використовувати -deleteпрапор пошуку:

find . -name "*.pdf" -delete

7
Ні, xargsспеціально розбиває список і при необхідності видає кілька команд.
— трійчатка

7
@Dennis: -maxdepth 1повинен бути першим аргументом після шляху.
— Barton Chittenden

54
У програмі Find є -deleteпрапор для видалення знайдених файлів, і навіть якщо цього не було, все-таки вважатимуться кращою практикою використовувати -execдля виконання rm, а не викликати xargs (який зараз 3 процеси та труба замість одного процесу з -deleteабо 2 процеси з -exec).
— скрагар

3
@ ÉdouardLopez ... Але це зчитування вводу, обмеженого NULL. І в цілому dangerous (broken, exploitable, etc.), досить смішно. Безперечно, ви повинні бути обережними при використанні xargs, але це не зовсім eval/evil.
— Відновіть Моніку. Будь ласка,

4
@scragar При -execвиклику rmкількість процесів становитиме 1 + кількість файлів, хоча кількість одночасних процесів із цього може бути 2 (можливо, знаходження може одночасно виконувати rm-процеси). Кількість використовуваних процесів xargsрізко зменшиться до 2 + n, де n - це численні процеси, менші за кількість файлів (скажімо, кількість файлів / 10, хоча ймовірно більше, залежно від довжини шляхів). Якщо припустити, що видалення виконує видалення безпосередньо, то використання -deleteмає бути єдиним процесом, який би викликався.
— нейронмер

396

тл; д-р

Це обмеження ядра на розмір аргументу командного рядка. forЗамість цього використовуйте цикл.

Походження проблеми

Це системне питання, пов'язане execveі ARG_MAXпостійне. Про це є багато документації (див. Man execve , wiki wiki ).

В основному, розширення виробляє команду (з її параметрами), яка перевищує ARG_MAXліміт. Для ядра 2.6.23встановлено ліміт 128 kB. Ця константа була збільшена, і ви можете отримати її значення, виконавши:

getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic

Рішення: Використання forциклу

Використовуйте forцикл, як це рекомендовано в BashFAQ / 095, і немає обмежень, окрім простору оперативної пам’яті / пам’яті:

Сухий запуск, щоб з’ясувати, видалить те, що очікується:

for f in *.pdf; do echo rm "$f"; done

І виконати:

for f in *.pdf; do rm "$f"; done

Крім того, це портативний підхід, оскільки глобус має сильну та стійку поведінку серед оболонок ( частина специфікації POSIX ).

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

Рішення: Використання find

Якщо ви наполягаєте, ви можете використовувати, findале насправді не використовувати xargs, оскільки це "небезпечно (зламано, експлуатується тощо) під час читання даних, не обмежених NUL" :

find . -maxdepth 1 -name '*.pdf' -delete 

Використання -maxdepth 1 ... -deleteзамість -exec rm {} +дозволяє findпросто виконувати необхідні системні дзвінки без використання зовнішнього процесу, отже, швидше (завдяки коментарю @chepner ).

Список літератури


31
Чудова відповідь, саме так слід відповідати на всі питання ТА. Дякую!
— приурочений

1
+1 для згадування forциклу. Раніше я користувався find, але завжди шукаю, як це зробити, коли я весь час забуваю варіанти тощо. forЗдається, простіше згадати ІМХО
— Роберт Дандон

3
Використовували його як for f in *; do rm "$f"; doneроботу як чарівність
— abdul qayyum

3
find -execРішення представляється набагато швидше , ніж forцикл.
— тричі

2
П'ять років пізніше в 4.15.0 ( 4.15.0-1019-gcpякщо бути точним), а ліміт залишається на рівні 2097152. Досить цікаво, пошук ARG_MAX на Linux git repo дає результат, показуючи, що ARG_MAX знаходиться на рівні 131702.
— Matt M.

181

findмає -deleteдію:

find . -maxdepth 1 -name '*.pdf' -delete

4
Це все ще поверне "Аргумент список занадто довгий". Принаймні для мене це робить. Використання xargs, відповідно до відповіді Денніса, працює за призначенням.
— Серхіо

7
Це звучить як помилка в пошуку.
— ThiefMaster

3
У @Sergio була така ж проблема, це було викликано відсутніми цитатами навколо шаблону імен.
— Луксьян

Так, чому інструмент для пошуку матеріалів навіть має перемикач для видалення? чи насправді лише мені не потрібно вважати найменшим і небезпечним.
— mathreadler

2
@mathreadler Він стосується того, що загальним випадком використання -execє видалення купи файлів. -exec rm {} +зробив би те саме, але все ж вимагає запустити хоча б один зовнішній процес. -deleteдозволяє findпросто виконувати необхідні системні дзвінки без використання зовнішньої обгортки.
— чепнер

21

Ще одна відповідь - змусити xargsобробляти команди партіями. Наприклад, до deleteфайлів 100одночасно, cdв каталог і запустіть це:

echo *.pdf | xargs -n 100 rm


4
Для видалення команди в Linux, що може бути катастрофою, якщо ви інженер і ви ввели помилку, я вважаю, що це "найбезпечніше, і я знаю, що відбувається" є найкращим. Не модні речі, які, якщо ви пропустите набір крапки, дозволять вашій компанії розбитися за одну хвилину.
— Штучний інтелект

1
Як ми можемо зробити це розширенням за замовчуванням для певних команд? Є дуже багато "стандартних" команд Linux, де відомо, чи потрібні вони всім відразу, чи ні (наприклад, "rm")
— user1212212

1
Зауважте, що це працює лише там, де echoвбудована оболонка. Якщо ви в кінцевому підсумку скористаєтеся командою echo, ви все одно натрапите на обмеження програмних аргументів.
— Toby Speight

14

Або ви можете спробувати:

find . -name '*.pdf' -exec rm -f {} \;

Це також видаляє файли з підкаталогів. Як цього запобігти?
— Вікі

@NikunjChauhan Додайте найважливіший варіант:find . -maxdepth 1 -name '*.pdf' -exec rm -f {} \;
— Джон Лін

Я не можу вставити параметр maxdepth
— Vicky

Цей варіант може бути лише для Linux, відповідно до відповіді @ Денніса (обрана відповідь).
— jvriesem

12

Якщо ви намагаєтесь одночасно видалити дуже велику кількість файлів (сьогодні я видалив каталог з 485 000+), ви, ймовірно, зіткнетеся з цією помилкою:

/bin/rm: Argument list too long.

Проблема полягає в тому, що коли ви вводите щось на кшталт rm -rf *, *файл замінюється списком кожного відповідного файлу, наприклад, "rm -rf file1 file2 file3 file4" тощо. Існує порівняно невеликий буфер пам'яті, виділений для зберігання цього списку аргументів, і якщо він заповнений, оболонка не виконає програму.

Щоб вирішити цю проблему, багато людей будуть використовувати команду find, щоб знайти кожен файл і передати їх по одному в команду "rm", як це:

find . -type f -exec rm -v {} \;

Моя проблема полягає в тому, що мені потрібно було видалити 500 000 файлів, і це зайняло занадто довго.

Я натрапив на набагато швидший спосіб видалення файлів - команда "find" має вбудований прапор "-delete" прямо! Ось що я закінчив:

find . -type f -delete

Використовуючи цей метод, я видаляв файли зі швидкістю близько 2000 файлів в секунду - набагато швидше!

Ви також можете показувати назви файлів, коли ви їх видаляєте:

find . -type f -print -delete

… Або навіть показати, скільки файлів буде видалено, а потім час, який потрібно для їх видалення:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s

Дякую. Я sudo find . -type f -deleteвидалив близько 485 тисяч файлів, і це працювало на мене. Зайняв близько 20 секунд.
— Найджел Олдертон

11

ви можете спробувати це:

for f in *.pdf
do
  rm $f
done

EDIT: Коментар ThiefMaster пропонує мені не розголошувати таку небезпечну практику для молодих jedis, тому я додам більш "безпечнішу" версію (задля збереження речей, коли у когось є файл "-rf. ..Pdf")

echo "# Whooooo" > /tmp/dummy.sh
for f in '*.pdf'
do
   echo "rm -i $f" >> /tmp/dummy.sh
done

Після запуску вищезазначеного просто відкрийте файл /tmp/dummy.sh у вашій радіомовлення. редактор і перевіряйте кожен рядок на наявність небезпечних імен файлів, коментуючи їх, якщо вони знайдені.

Потім скопіюйте сценарій dummy.sh у свій робочий каталог та запустіть його.

Все це з міркувань безпеки.


5
Я думаю, що це зробить дуже приємні речі з файлом на ім'я, наприклад,-rf .. .pdf
— ThiefMaster

так, це було б, але, як правило, при використанні в оболонці видавець команди "повинен" поглянути на те, що він робить :). Насправді я вважаю за краще переспрямувати файл і перевірити кожен рядок.
— BigMike

2
Це не цитує "$ f". Саме про це говорив ThiefMaster. -rfмає перевагу над -i, тому ваша 2-а версія не є кращою (без ручного огляду). І в основному марний для масового видалення через підказки для кожного файлу.
— Пітер Кордес

7

Ви можете використовувати масив bash:

files=(*.pdf)
for((I=0;I<${#files[@]};I+=1000)); do
    rm -f "${files[@]:I:1000}"
done

Таким чином він буде стиратися партіями по 1000 файлів за крок.


2
Для великої кількості файлів це здається значно швидше
— James Tocknell


4

У команді rm є обмеження файлів, які ви можете одночасно видалити.

Одна з можливостей їх можна видалити, використовуючи кілька разів команду rm на основі моделей файлів, наприклад:

rm -f A*.pdf
rm -f B*.pdf
rm -f C*.pdf
...
rm -f *.pdf

Ви також можете видалити їх за допомогою команди find :

find . -name "*.pdf" -exec rm {} \;

3
Ні, rmнемає такого обмеження щодо кількості файлів, які вони оброблять (крім того, що його argcне може бути більше INT_MAX). Це обмеження ядра на максимальний розмір всього масиву аргументів (саме тому довжина імен файлів має велике значення).
— Toby Speight

3

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

find -maxdepth 1 -name '*.pdf' -exec rm "{}" \;

У цьому реченні шукайте всі файли у поточному каталозі (-maxdepth 1) з розширенням pdf (-name '* .pdf'), а потім видаліть кожен (-exec rm "{}").

Вираз {} замінить ім'я файлу і, "{}" встановить ім'я файлу як рядок, включаючи пробіли або спеціальні символи.


Хоча цей фрагмент коду може вирішити питання, включаючи пояснення, як і чому це вирішує проблему , справді допоможе покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
— Toby Speight

Вся справа в -execтому, що ви не викликаєте оболонку. Цитати тут не роблять абсолютно нічого корисного. (Вони запобігають будь-якому розширенню шаблону і розбиттю маркера на рядку в оболонці, куди ви вводите цю команду, але рядок {}не містить жодних пробілів або символів підстановки оболонки.)
— tripleee

2

Я зіткнувся з тією ж проблемою, коли копіював каталог джерела до місця призначення

у вихідному довіднику було файлів ~ 3

Я використав CP з опцією -r, і це працювало для мене

cp -r abc / def /

він буде копіювати всі файли з abc в def, не надто довго попереджаючи список аргументів


Я не знаю, чому хтось спротив це, навіть не коментуючи це (це політика, люди!). Мені потрібно було видалити всі файли всередині папки (питання, зокрема, не в PDF-файлах), і для цього цей трюк спрацьовує добре. Зрештою, потрібно відновити папку, яку видалили, коли Я використав `rm -R / path / to / folder".
— Томас Темпельман,

1
Це працює, тому що у випадку з ОП він використовував *, який розширився до величезного списку .pdf, даючи каталог, це спричинить це внутрішнє лікування, таким чином, не потрібно мати справу з проблемою ОП. Я думаю, що це було знято з цієї причини. Це може бути непридатним для ОП, якщо він вклав каталог або інші файли (не pdf) у своєму каталозі
— Альвейн

2

Спробуйте це також. Якщо ви хочете видалити файли / папки, що перевищують 30/90 днів (+) або ще нижче, ніж 30/90 (-) днів, тоді ви можете використовувати наведені нижче команди

Наприклад: Якщо 90days виключає вище після видалення файлів / папок 90days, це означає 91,92 .... 100 днів

find <path> -type f -mtime +90 -exec rm -rf {} \;

Напр.: Для останніх останніх 30 днів файли, які ви хочете видалити, скористайтеся командою нижче (-)

find <path> -type f -mtime -30 -exec rm -rf {} \;

Якщо ви хочете отримати файли більше двох днів

find <path> -type f -mtime +2 -exec gzip {} \;

Якщо ви хочете бачити файли / папки лише за останній місяць. Наприклад:

find <path> -type f -mtime -30 -exec ls -lrt {} \;

Понад 30 днів більше лише тоді перелічіть файли / папки Ex:

find <path> -type f -mtime +30 -exec ls -lrt {} \;

find /opt/app/logs -type f -mtime +30 -exec ls -lrt {} \;

2

Я здивований, що тут немає ulimitвідповідей. Кожен раз, коли у мене є ця проблема, я опиняюся тут або тут . Я розумію, що це рішення має обмеження, але, ulimit -s 65536здається, часто робить для мене трюк.


1

У мене була така ж проблема з папкою, повної тимчасових зображень, яка зростала з кожним днем, і ця команда допомогла мені очистити папку

find . -name "*.png" -mtime +50 -exec rm {} \;

Різниця від інших команд - це параметр mtime, який займе лише файли, старші X днів (у прикладі 50 днів)

Використовуючи це кілька разів, зменшуючи з кожним виконанням денного діапазону, я зміг видалити всі непотрібні файли


1

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

ls | grep .pdf > list.txt
wc -l list.txt

wc -l - порахувати, скільки рядків містить list.txt. Коли ви маєте уявлення про те, як це триває, ви можете вирішити розділити його навпіл, вперед чи щось. Використання команди split -l Наприклад, розділіть її на 600 рядків.

split -l 600 list.txt

це створить кілька файлів з назвою xaa, xab, xac і так далі, залежить від того, як ви розділите його. Тепер, щоб "імпортувати" кожен список із цього файлу в команду rm, використовуйте це:

rm $(<xaa)
rm $(<xab)
rm $(<xac)

Вибачте за мою погану англійську.


5
Якщо у вас є файл з назвою, pdf_format_sucks.docxце буде видалено також ... ;-) Ви повинні використовувати правильне та точне регулярне вираження під час прив’язки до файлів pdf.
— FooF

1
Краще, але still_pdf_format_sucks.docxбуде видалено. Крапка .в ".pdf"регулярному виразі відповідає будь-якому символу. Я б запропонував "[.]pdf$"замість цього .pdf.
— FooF

1

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

find . -name "*.pdf" -print0 | xargs -0 rm -rf

Я закінчив писати сценарій python для видалення файлів на основі перших 4 символів у назві файлу:

import os
filedir = '/tmp/' #The directory you wish to run rm on 
filelist = (os.listdir(filedir)) #gets listing of all files in the specified dir
newlist = [] #Makes a blank list named newlist
for i in filelist: 
    if str((i)[:4]) not in newlist: #This makes sure that the elements are unique for newlist
        newlist.append((i)[:4]) #This takes only the first 4 charcters of the folder/filename and appends it to newlist
for i in newlist:
    if 'tmp' in i:  #If statment to look for tmp in the filename/dirname
        print ('Running command rm -rf '+str(filedir)+str(i)+'* : File Count: '+str(len(os.listdir(filedir)))) #Prints the command to be run and a total file count
        os.system('rm -rf '+str(filedir)+str(i)+'*') #Actual shell command
print ('DONE')

Це дуже добре працювало для мене. Я зміг очистити понад 2 мільйони тимчасових файлів у папці приблизно за 15 хвилин. Я прокоментував гугл із небагато коду, тому будь-хто з мінімальними знаннями пітона не може маніпулювати цим кодом.


1

І ще один:

cd  /path/to/pdf
printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm

printfце вбудована оболонка, і наскільки я знаю, вона завжди була такою. Тепер, враховуючи, що printfце не командна оболонка (а вбудована), вона не підлягає "argument list too long ... " фатальна помилка.

Таким чином, ми можемо безпечно використовувати його з шаблонами глобальної оболонки, такими як *.[Pp][Dd][Ff], тоді ми передаємо його вихід для видалення ( rm) команди, через xargs, що гарантує, що він вміщує достатньо імен файлів у командному рядку, щоб не провалити rmкоманду, яка є оболонкою командування.

\0У printfподачах як нульовий роздільник імен файлів яким потім обробляються з допомогою xargsкоманди, використовуючи його ( -0) в якості роздільника, тому rmне терпить невдачу , коли є білі прогалини або інші спеціальні символи в іменах файлів.


1
Хоча цей фрагмент коду може вирішити питання, включаючи пояснення, як і чому це вирішує проблему , справді допоможе покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
— Toby Speight

Зокрема, якщо printfне вбудована оболонка, вона буде обмежена тим же обмеженням.
— Toby Speight

0

Ви можете створити папку temp, перемістити всі файли та підпапки, які ви хочете зберегти у папку temp, потім видалити стару папку та перейменувати папку temp у стару папку, спробуйте цей приклад, поки ви не будете впевнені, що робити це в прямому ефірі:

mkdir testit
cd testit
mkdir big_folder tmp_folder
touch big_folder/file1.pdf
touch big_folder/file2.pdf
mv big_folder/file1,pdf tmp_folder/
rm -r big_folder
mv tmp_folder big_folder

rm -r big_folderне буде видалено всі файли в big_folderнезалежно від того , скільки. Ви просто повинні бути дуже обережними, спочатку у вас є всі файли / папки, які ви хочете зберегти, в цьому випадку це булоfile1.pdf


0

Щоб видалити всі *.pdfв каталозі/path/to/dir_with_pdf_files/

mkdir empty_dir        # Create temp empty dir

rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

Видалення конкретних файлів за rsyncдопомогою підстановки - це, мабуть, найшвидше рішення, якщо у вас мільйони файлів. І він подбає про помилку, яку ви отримуєте.


(Необов’язковий крок): DRY RUN. Щоб перевірити, що буде видалено без видалення. `

rsync -avhn --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

. . .

Клацніть поради та поради щодо rsync, щоб отримати більше хак-файлів rsync


0

Я виявив, що для надзвичайно великих списків файлів (> 1e6) ці відповіді були надто повільними. Ось рішення з використанням паралельної обробки в python. Я знаю, я знаю, це не Linux ... але нічого іншого тут не працювало.

(Це врятувало мене години)

# delete files
import os as os
import glob
import multiprocessing as mp

directory = r'your/directory'
os.chdir(directory)


files_names = [i for i in glob.glob('*.{}'.format('pdf'))]

# report errors from pool

def callback_error(result):
    print('error', result)

# delete file using system command
def delete_files(file_name):
     os.system('rm -rf ' + file_name)

pool = mp.Pool(12)  
# or use pool = mp.Pool(mp.cpu_count())


if __name__ == '__main__':
    for file_name in files_names:
        print(file_name)
        pool.apply_async(delete_files,[file_name], error_callback=callback_error)

0

Я зіткнувся з подібною проблемою, коли було мільйони непотрібних файлів журналів, створених програмою, яка заповнила всі вузли. Я вдався до "locate", отримав усі файли, "розташовані" d, у текстовий файл, а потім видаляв їх по черзі. Взяв час, але зробив роботу!


Це досить невиразно і вимагає, щоб ви встановили locateназад, коли у вас ще було місце на диску.
— трійчатка

-2

Трохи безпечніша версія, ніж використання xargs, також не рекурсивна: ls -p | grep -v '/$' | grep '\.pdf$' | while read file; do rm "$file"; done

Фільтрування наших каталогів тут трохи непотрібне, оскільки 'rm' все одно не видалить його, і його можна видалити для простоти, але навіщо запускати щось, що обов'язково поверне помилку?


3
Це зовсім не є безпечним і не працює з іменами файлів з новими рядками, щоб вказати на один очевидний кутовий випадок. Парсингls - це звичайний антипатерн, якого, безумовно, слід уникати, і тут додається ряд додаткових помилок. Це grep | grepпросто не дуже елегантно.
— трійка

Як би там не було, це нова і екзотична проблема, яка потребує комплексного вирішення. Відповіді findхороші та добре задокументовані тут і деінде. Докладніше про цю та пов’язані з цим теми дивіться, наприклад, на mywiki.wooledge.org .
— трійчатка

-2

Використовувати паралельний ( sudo apt install parallel) GNU дуже просто

Він запускає команди багатопотокові, де '{}' є переданим аргументом

Напр

ls /tmp/myfiles* | parallel 'rm {}'


Я не знаю, але я здогадуюсь, що це тому, що передача виводу lsбезпосередньо на інші команди є небезпечним антипаттерном - це і той факт, що розширення підстановки призведе до того ж збою при виконанні, lsяк досвідчений в оригінальній rmкоманді .
— Toby Speight

Для контексту щодо цього див. ParsingL . А parallelдеякі люди, які вважають за краще уникати складності, незручніше - якщо заглянути під капот, це досить непрозоро. Перегляньте посилання списку розсилки на list.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html між Stephane (одним із сірих кольорів Unix & Linux StackExchange) та Ole Tange (автор Parallel). xargs -Pтакож паралельно, але це робиться більш простим, глухим способом з меншою кількістю рухомих частин, що робить його поведінку набагато простішим передбаченням і обґрунтуванням.
— Чарльз Даффі

-2

Для видалення перших 100 файлів:

rm -rf 'ls | голова -100 '


2
Небезпечно (або було б, якщо ви використовували зворотні котирування, як очевидно, задумано) - якщо будь-яке ім'я файлу містить метахарактеристики оболонки, включаючи пробіли, результати будуть не такими, якими ви задумали.
— Toby Speight

-5

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

for file in /usr/op/data/Software/temp/application/openpages-storage/*; do
    cp "$file" /opt/sw/op-storage/
done

Просто запустіть вищевказану команду, і вона зробить завдання.

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