Как бы я переименовал много файлов с помощью командной строки?

У меня есть проблема, которую я не могу решить: мне нужно переименовать большой дамп файлов, используя шаблоны. Я пытался использовать 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 для перемещения файлов.

К сожалению, о графическом программном обеспечении не может быть и речи, поскольку сервер, содержащий файлы, - это сервер, имеющий только интерфейс командной строки.

1
задан 19 June 2012 в 23:36

2 ответа

Я использую это для массового переименования: vidir. Это использует более или менее тот же синтаксис нас vi делает!

apt-get install moreutils

Перейдите к каталогу с 160k файлами

cd dir

Запуск vidir

vidir

Затем замените все: в имени файла с, например, -

: % s/:/-/g

То же с другими странными символами как?

: % s/?/-/g

Теперь сохраните файлы, с: w

vidir позволяет редактировать содержания каталога в текстовом редакторе.

http://joeyh.name/code/moreutils/

2
ответ дан 19 June 2012 в 23:36

Использование 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 .

0
ответ дан 19 June 2012 в 23:36

Другие вопросы по тегам:

Похожие вопросы: