Список аргументів занадто довга помилка для команд 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.