Я намагаюся запустити команду, подібну до наведеної нижче, в скрипті bash. Він повинен шукати всі підпапки $sourcedir
та копіювати всі файли певного типу на кореневий рівень $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Це , здається, досить близько, за винятком того, що {}
не передається як $2
до-exec sh -c ...
Я хотів би зробити це максимально наближеним до "правильного шляху", з толерантністю до спеціальних символів у назви файлів (конкретно символів з одинарними цитатами).
Редагувати: я бачу людей, які пропонують використовувати xargs
або ланцюжок аргументів. У мене було враження, що для обмеженої кількості аргументів це нормально. Якщо у мене, наприклад, є тисячі файлів .jpg, які я намагаюсь скопіювати з декількох каталогів галереї у гігантський каталог слайд-шоу, чи все ж таки ланцюжки аргументів можуть працювати?
Редагувати 2: Моя проблема полягала в тому, що я не вистачав _
до мого першого варіанту, щоб перейти до -exec
команди. Для тих, хто цікавиться, як змусити команду find працювати, додайте _
і все буде добре:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Я прийняв відповідь нижче, хоча тому, що вона виконує те саме завдання, але є більш ефективною та елегантною.
xargs
було створено коли-небудь автоматичне обробку величезної кількості аргументів на звичайні команди, які мали обмеження. Також слід врахувати, що більшість максимальних обмежень аргументів значно покращені для стандартних утиліт GNU. Ви також побачите перевагу від продуктивності, уникаючи всіх тих вилок процесів, які на тисячах файлів є релевантними.