У меня есть проблема, которую я не могу решить: мне нужно переименовать большой дамп файлов, используя шаблоны. Я пытался использовать this , но всегда получаю ошибку.
У меня есть папка внутри с партией файлов. Запустив ls -1 | wc -l
, я получаю 160000 файлов внутри. Проблема в том, что я хочу переместить эти файлы в систему Windows, но в большинстве из них есть такие символы, как :
и ?
, что делает файл недоступным в указанных системах на основе Windows.
(Как метод «не решать, но иметь дело с» ), я попытался загрузить LiveCD в системе Windows и переместить файлы с помощью действующей ОС. В Ubuntu эти файлы были читаемыми и доступный для записи в смонтированном разделе NTFS, но когда я снова загрузился в Windows, он показал, что файл есть, но Windows не смогла получить к нему доступ каким-либо образом: переименовать, удалить или открыть.)
Я попытался запустить [ 113] внутри папки, но я получил Список аргументов слишком длинный ошибка. Некоторые поиски показали, что это происходит потому, что у меня так много файлов, и затем я приехал сюда . Проблема в том, что я не знаю, как изменить команду в соответствии с моими потребностями, так как у меня всегда возникают различные ошибки, такие как
find -name '*:*' | xargs rename : _
получается xargs: unmatched одинарная кавычка; по умолчанию кавычки являются специальными для xargs, если только вы не используете синтаксическую ошибку опции -0 [\ n] в строке (eval 1) 1, рядом с ":" [\ n] xargs: rename: выход со статусом 255; прерывание -0
после xargs
превращает сообщение об ошибке в xargs: слишком длинная строка аргумента Эти файлы являются архивными файлами генерируется различными PHP-скриптами. Лучшим решением было бы иметь возможность переименовать их до того, как они будут перемещены в Windows, но если нет способа сделать это, у нас может быть способ переименовать файлы , тогда как они перемещены в Windows. Я использую samba
и proftpd
для перемещения файлов.
К сожалению, о графическом программном обеспечении не может быть и речи, поскольку сервер, содержащий файлы, - это сервер, имеющий только интерфейс командной строки.
Я использую это для массового переименования: vidir
. Это использует более или менее тот же синтаксис нас vi
делает!
apt-get install moreutils
Перейдите к каталогу с 160k файлами
cd dir
Запуск vidir
vidir
Затем замените все: в имени файла с, например, -
: % s/:/-/g
То же с другими странными символами как?
: % s/?/-/g
Теперь сохраните файлы, с: w
vidir позволяет редактировать содержания каталога в текстовом редакторе.
Использование find -exec должно работать, хотя оно будет проходить через подкаталоги, что, в свою очередь, приведет к сбою, если в каком-либо из подкаталогов окажется :
или ?
.
find . -name "*[:?]*" -exec rename 'y/:?/__/' {} +
Ошибка argument list too long
, которую вы получаете, потому что *
расширяется до всех 160k файлов в каталоге, что превышает максимальную длину аргумента в вашей системе.
$ getconf ARG_MAX
2097152
160К имен файлов могут легко превышать 2МБ. Вы можете обойти это, переименовывая по одному файлу за раз
for file in ./*[:?]*; do
mv "$file" "${file//[:?]/_}"
done
или заполнив массив и обработав его порциями. Размер фрагмента зависит от средней длины имен файлов и значения ARG_MAX; или просто установите достаточно низкое значение, чтобы быть безопасным, например, 1000:
files=( ./*[:?]* ) n=${#files[@]}
size=1000
for (( i=0; i<n; i+=size )); do
rename 'y/:?/__/' "${files[@]:i:size}"
done
Также см. BashFAQ 30 .