26

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

Что я могу сделать по этому поводу? Есть ли способ использовать символ Юникода для пробела?

5 ответов5

32

Выйдите из пространства, например, Spring\ 2011 , или используйте кавычки, например 'Spring 2011' . В будущем, как правило, плохая идея использовать имена файлов с пробелами в них в любой * NIX.

Если у вас есть rename , вы можете использовать это:

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

Если на вашем компьютере есть команда переименования , тогда все пробелы в файле / директории в текущем рабочем каталоге будут заменены на подчеркивания:

rename 's/ /_/g' *
23

Если у вас нет rename или вы предпочитаете использовать только оболочку:

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

Сломано:

  • *\ * выбирает все файлы с пробелом в имени в качестве входных данных для цикла for .
  • Кавычки вокруг "$f" важны, потому что мы знаем, что в имени файла есть пробел, и в противном случае он будет отображаться как 2+ аргумента mv .
  • ${f//str/new_str} - это особенность подстановки строк в bash. Все экземпляры str заменены на new_str .
3

mv "Spring 2011.file" Spring_2011.file должен указать командной строке принять строку в кавычках в качестве одного ввода.

0

Чтобы программно переименовать 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .