Удалить пробелы в названиях файлов
Здесь, если я использую только ls | egrep '. ' команду, она дает мне все имя файла с пробелами в именах файлов. Но когда я пытаюсь передать вывод в rm, все пробелы (ведущие или конечные) удаляются. Так что моя команда не выполняется должным образом.
Любые указатели о том, как удалить файл, по крайней мере один пробел в их имени?
Вы можете использовать стандартное перетаскивание в rm команде:
Это удалит любой файл, имя которого содержит пробел; пространство освобождается, поэтому оболочка не интерпретирует его как разделитель. Добавление -- позволит избежать проблем с именами файлов, начинающимися с тире (они не будут интерпретироваться как аргументы rm ).
Если вы хотите подтвердить каждый файл перед его удалением, добавьте -i опцию:
Вам определенно захочется пройти через это echo сначала, чтобы избежать опечаток. Добавьте echo спереди, и он распечатает все файлы, которые собирается удалить.
Анудж, причина, по которой это вызывает наибольшее количество голосов, заключается в том, что, хотя find это мощно, иногда вам не нужно убивать курицу из пулемета. Администраторы UNIX, как правило, не прибегают find (например) к «удалению всех файлов, начинающихся с буквы A» . просто так rm A* . Аналогично, чтобы удалить файлы, содержащие пробелы, rm может сделать эту работу. Другими словами, не обманывайте себя, потому что пространство невидимо и обрабатывается специально оболочкой. Просто избежите этого, как сделал Стивен Китт, и вы можете думать об этом как о любом другом персонаже.
Я бы не стал разбирать ls вывод
Почему бы и нет :
Нет проблем с rm :-).
Хотя это рекурсивно и удалит все файлы с пробелами в текущем каталоге и вложенных каталогах, как упомянуто в комментариях.
(1) вы можете использовать -name '* *' вместо регулярного выражения; и (2) вы можете использовать -print0 | xargs -0 rm -i для решения проблемы @ StephenKitt.
Посмотрите на это Предположим, имя "странный файл"
тогда вы видите инод
В случае очень странных имен файлов, таких как
xargs читает элементы из стандартного ввода, разделенные пробелами (которые могут быть защищены двойными или одинарными кавычками или обратной косой чертой) или символами новой строки, и выполняет команду (по умолчанию это / bin / echo) один или несколько раз с последующими начальными аргументами по элементам, прочитанным из стандартного ввода. Пустые строки на стандартном вводе игнорируются.
ls | egrep '. ' | xargs -d '\n' rm (не делай этого . читай дальше)
Но что, если имя файла содержит новую строку?
touch "filename with blanks and newline"
Поскольку имена файлов Unix могут содержать пробелы и символы новой строки , такое поведение по умолчанию часто проблематично; имена файлов, содержащие пробелы и / или символы новой строки, неправильно обрабатываются xargs. В этих ситуациях лучше использовать опцию -0 , которая предотвращает подобные проблемы.
ls это действительно инструмент для непосредственного потребления человеком , вместо этого нам нужно использовать find команду, которая может разделять имена файлов нулевым символом ( -print0 ). Мы также должны указать grep использовать нулевые символы для разделения input ( -z ) и output ( -Z ). Наконец, мы говорим Xargs также использовать нулевые символы ( -0 )
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Код: @echo off setlocal for /f "tokens=*" %%i in (' dir /b ') do call:ren "%%i" goto:eof :ren set "file=%~1" ren %1 %file: =% » |
Конфигурация компьютера | |
Процессор: 486 DX-40 | |
Память: SIMM 4MB | |
HDD: IBM 80MB | |
Видеокарта: S3 Trio 512k | |
Звук: PC Speaker | |
Блок питания: AAA | |
CD/DVD: FDD 5" - 720Kb | |
Монитор: CGA 12" | |
Ноутбук/нетбук: MK-51 | |
ОС: MS-DOS 3.11 | |
Индекс производительности Windows: 3.14159265358 | |
Прочее: gray mouse. with pink eyes |
так по прикидке.
' dir /b ' заменить на ' dir исходная_папка /b '
ren %1 %file на что-то типа
ren исходная_папка%1 другая_папка%file
из той же папки что и сами фаилы запускать батник в данной ситуации нельзя » |
точно, все гениальное просто, единственное что ren надо по другому переделать
@echo off
setlocal
for /f "tokens=*" %%i in ('dir c:\Temp\1 /b') do call:ren "%%i"
move c:\Temp\1\*.* c:\Temp\arch
goto:eof
:ren
set "file=%~1"
ren c:\Temp\1\%1 %file: =%
такой скрипт в результате убирает пробелы из имен фаилов в папке c:\Temp\1 и перемещает их в папку c:\Temp\arch
а почему Цитата erufa: из той же папки что и сами фаилы запускать батник в данной ситуации нельзя » » |
потому что надо фаилы переместить в другую папку. сам себя скрипт тоже переместит
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
наверное надо показать содержимое файла и его кодировку или как надо догадываться от чего это может быть?
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
wmic bios get serialnumber>>С:\%computername%-serial-%date%.txt 2>>&1
: Пробелы в конце обеих строк.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
merdzd,
в данном случае виноват именно wmic, он и почуднее бывает выводит что приходится двумя for выводить. В вашем случае можно так:
Как удалить пробелы (не заменять подчеркиваниями) из нескольких тысяч файлов в Windows? Могу ли я сделать это с помощью команды DOS?
В настоящее время
Все файлы должны стать:
Вот скрипт, который может эффективно переименовывать файлы, удаляя все пробелы из имени.
Предположим, что скрипт называется renameNoSpace.bat
renameNoSpace : (без аргументов) Переименовывает файлы в текущем каталоге
renameNoSpace /R : переименовывает файлы в дереве папок с корнем в текущем каталоге
renameNoSpace myFolder : переименовывает файлы в каталоге «myFolder», найденном в текущем каталоге.
renameNoSpace "c:\my folder\" : переименовывает файлы по указанному пути. Кавычки используются, потому что путь содержит пробел.
renameNoSpace /R c:\ : переименовывает все файлы на диске C:.
Создайте файл powershell - *.ps1 расширение
Напишите этот код:
сохраните, затем щелкните правой кнопкой мыши -> работать с powershell
Вы можете написать простой скрипт, который делает это для одного файла /каталога, например:
. а затем, если хотите, запустите его для всех файлов и /или каталогов, которые вам нужны. Например, если вы создадите вышеупомянутый скрипт как myrenamingscript.cmd, вы можете запустить его для всех файлов, не являющихся каталогами, в текущем каталоге, выполнив:
Проблема, с которой я столкнулся, заключается в том, что существует вероятность того, что уже существует файл с именем, которое вы пытаетесь присвоить новому файлу (например, если в папке есть 2 файла с именем «file one.txt» и « file_one.txt "при попытке заменить пробелы подчеркиванием один файл заменит другой). Поэтому я создал этот скрипт, который проверяет, существует ли новое имя, и, если это так, помещает число в конце имени файла (добавляет 1 к числу, пока не будет другого файла с таким именем). Инструкции о том, что изменить, находятся вверху (рекомендованные строки). Не храните пакетный файл в той же папке, где у вас есть файлы, которые нужно переименовать, если вы используете опцию *. * Надеюсь, это поможет.
Похожие вопросы
Популярные теги
Как удалить пробелы (не заменять символами подчеркивания) из нескольких тысяч файлов в Windows? Могу ли я сделать это из команды DOS?
В настоящее время:
Все файлы должны стать:
Вот скрипт, который может эффективно массово переименовывать файлы, удаляя все пробелы из имени.
Предположим, скрипт называется renameNoSpace.bat.
renameNoSpace : (без аргументов) Переименовывает файлы в текущем каталоге
renameNoSpace /R : переименовывает файлы в дереве папок с корнем в текущем каталоге.
renameNoSpace myFolder : переименовывает файлы в каталоге «myFolder», найденном в текущем каталоге.
renameNoSpace "c:\my folder\" : переименовывает файлы по указанному пути. Кавычки используются, потому что путь содержит пробел.
renameNoSpace /R c:\ : переименовывает все файлы на диске C:.
@Mel - Да - все исправлено. Спасибо. Я тоже переименовал скрипт во что-то толковое. Я имел в виду и "renameStrip", и "renameNoSpace", но мой мозг замкнулся и написал "renameNoStrip".
Почему в ("%inPath%* *") две звездочки? Я не владею этим языком, но думаю, что это означает все в inPath и, кроме того, все в текущем каталоге. Я изменил его на ("%inPath%*.myext), и он работает.
@Peter - Нет, это один путь, и * * (звездочка, пробел, звездочка) представляет имя файла, по крайней мере, с одним пробелом. Это не обязательно, но оптимизирует скрипт, чтобы он не тратил время на «переименование» файлов, в которых нет места.
- Откройте командную строку.
- Перейдите в папку с помощью команды cd (например: cd "путь к вашей папке").
- Откройте powershell, набрав: powershell
- Затем введите это: get-childitem *.mp3 | foreach
Если кто-то хочет сделать это рекурсивно и в подкаталогах, добавьте -Recurse -Include прямо перед *.mp3
Создайте файл powershell - *.ps1 расширение
Напишите этот код:
сохранить, затем щелкните правой кнопкой мыши -> запустить с помощью powershell
это не удалось для меня, потому что я думаю, что в каталоге тоже есть пробелы, и команда dir туда не попадает, я пробовал другие коды с получением детей, он работает из командной строки powershell в каталоге, так что. та же команда с где линия. Спасибо
Вы можете написать простой скрипт, который делает это для одного файла/каталога, например:
. а затем, если хотите, запустите его по всем файлам и/или каталогам, которые вам нужны. Например, если вы создадите приведенный выше скрипт как myrenamingscript.cmd, вы можете запустить его для всех файлов, не являющихся каталогами, в текущем каталоге, выполнив:
хорошо, поэтому я создал файл с именем, myrenamingscript.cmd и в нем я скопировал приведенный выше скрипт и сохранил его как .cmd, а затем запустил его (дважды щелкните по нему.?), я не понял вашу последнюю часть, где вы сказали использовать for.
Сценарий, который я предоставил, переименовывает один заданный файл или каталог в то же имя, но с удаленными пробелами. Если вы хотите сделать это для всех файлов в данном каталоге, вам нужно будет запустить сценарий для всех файлов в каталоге. Последний комментарий - способ сделать это.
Откройте Powershell в Windows, а затем введите следующую команду после перехода в папку, в которой вы хотите переименовать файлы.
Давайте проанализируем это:
get-childitem *.mp3 Здесь перечислены все файлы, имена которых заканчиваются на .mp3. Затем они передаются следующей команде с параметром | оператор.
Это заменяет все экземпляры " " (в данном случае пробел || это экземпляр, который должен быть заменен) ничем, обозначенным "", эффективно стирая слово из всех файлов в каталоге.
Вы также можете изменить get-childitem *.mp3 на get-childitem — это переименует все файлы в каталоге, а не только файлы, имена которых заканчиваются на .mp3.
Если вам не нравится описанный выше метод, есть отличная программа под названием Bulk Rename Utility. Я использовал это программное обеспечение лично, и вы можете получить много инструкций на YouTube, как его использовать.
Читайте также: