Як перейменувати файли з пробілами за допомогою оболонки Linux?


28

Я назвав декілька файлів з пробілами в них і хочу замінити пробіл на _. Однак кожного разу, коли я записую команду в оболонку з назвою файлу (наприклад Spring 2011), оболонка не розпізнає файл чи каталог.

Що я можу з цим зробити? Чи є спосіб використовувати символ unicode для пробілу?


для програмного перейменування N файлів використовуйте bashцикл for: див. моє рішення тут .
Тревор Бойд Сміт

Відповіді:


33

Вийдіть з простору, наприклад Spring\ 2011, або використовуйте лапки, наприклад 'Spring 2011'. Надалі, як правило, погана ідея використовувати імена файлів з пробілами в них на будь-якому * NIX.

Якщо у вас є rename, ви можете скористатися цим:

rename ' ' '_' [filenames...]

1
Чи знаєте ви, що все-таки можна зробити це для всіх файлів одночасно?

3
Чому це погана ідея? Це відповідальність програміста за належне поводження з іменами файлів.
glenn jackman

1
@rafe, насправді це схильність до неправильної обробки імен файлів спереду. Додаткові зусилля виникають при налагодженні сценарію, коли ви просто забули цитувати змінні, що містять ім’я файлу.
glenn jackman

3
Ця відповідь, здається, не працює (принаймні, на Ubuntu 12.04 LTS). Однак відповідь від unutbu працює чудово.
ДНК

1
це лише перше місце для мене ... що не корисно (у мене renameверсія 2.23)
Тревор Бойд Сміт

30

Якщо на вашій машині є команда перейменування , це змінить всі пробіли на підкреслення у всіх файлах / dirs у поточному робочому каталозі:

rename 's/ /_/g' *

Підтверджено, що працює в Ubuntu 12.04
anthonygore

1
не працювало для мене ... У мене з’явилася помилка "перейменувати: недостатньо аргументів". у мене є версія rename --version rename from util-linux 2.23.2.
Тревор Бойд Сміт

-bash: /usr/bin/rename: Argument list too long
nmz787

24

Якщо у вас немає renameабо вважаєте за краще використовувати тільки оболонку:

for f in *\ *; do mv "$f" "${f// /_}"; done

Зломаний:

  • *\ *вибирає всі файли з пробілом у їх імені як вхід для forциклу.
  • Цитати навколо "$f"є важливими, оскільки ми знаємо, що в назві файлу є пробіл, інакше це може бути аргументом 2+ mv.
  • ${f//str/new_str}- специфічна для підстановки рядка заміна. Усі екземпляри strзамінено на new_str.

2
це працює, але для мене він замінює лише перший пробіл. якщо я використовую for f in *\ *; do mv "$f" "${f// /_}"; doneце працює
billynoah

@billynoah Хороший улов, оновлено.
blahdiblah

@blahdiblah Дякую вам дуже! Ви просто заощадили мені стільки часу!
Партизанська

@blahdiblah ваше рішення набагато елегантніше мого рішення . хороша робота. Я не думав, що глобус для циклу буде працювати ... так що я зробив глобус поза циклу for.
Тревор Бойд Сміт

3

mv "Spring 2011.file" Spring_2011.file слід сказати командному рядку приймати цитований рядок як єдиний вхід.


Це єдина відповідь, яку я міг взяти на роботу.
blakeoft

1

Для програмного перейменування N файлів можна використовувати простий bashцикл.

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

Якщо у вас менше 5 імен файлів, ви можете вручну ввести всі назви файлів і використовувати renameкоманду, як запропоноване вище рішення . Але для мене ... я віддаю перевагу програмному рішенню ... навіть коли є лише 4 файли.

пс

якщо ви не знайомі з Bashрозширенням параметра (тобто ${filename// /_}), ви можете скористатися renameкомандою:

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.