Убрать начальную точку из имени файла bash script - PullRequest
11 голосов
/ 21 января 2011

У меня есть несколько файлов в куче каталогов, которые имеют начальную точку и, следовательно, скрыты.Я хотел бы отменить это и удалить начальную точку.

У меня не получилось выполнить следующее:

for file in `find files/ -type f`;
do
base=`basename $file`
if [ `$base | cut -c1-2` = "." ];
then newname=`$base | cut -c2-`;
dirs=`dirname $file`;
echo $dirs/$newname;
fi
done

Что не удалось выполнить в условии:

[: =: unary operator expected

Кроме того, в некоторых файлах есть пробел, и файл возвращает их разделенными.

Любая помощь приветствуется.

Ответы [ 3 ]

23 голосов
/ 21 января 2011

Самый простой способ удалить что-либо из начала переменной - это использовать ${var#pattern}.

$ FILENAME=.bashrc;    echo "${FILENAME#.}"
bashrc
$ FILENAME=/etc/fstab; echo "${FILENAME#.}"
/etc/fstab

См. Справочную страницу bash:

${параметр # слово}
$ {параметр ## слово}

Слово расширяется для создания шаблона, как при расширении пути.Если шаблон соответствует началу значения параметра, то результатом раскрытия является расширенное значение параметра с кратчайшим совпадающим шаблоном (случай «#») или самым длинным совпадающим шаблоном («##»).'case) удалено.

Кстати, с более избирательной командой find вам не нужно выполнять всю тяжелую работу.Вы можете find сопоставлять только файлы с лидирующей точкой:

find files/ -type f -name '.*'

Сбросить все вместе, затем:

find files/ -type f -name '.*' -printf '%P\0' |
    while read -d $'\0' path; do
        dir=$(dirname "$path")
        file=$(basename "$path")
        mv "$dir/$file" "$dir/${file#.}"
    done

Дополнительные примечания:

  1. Чтобы правильно обрабатывать имена файлов с пробелами, вам нужно заключать в кавычки имена переменных, когда вы ссылаетесь на них.Напишите «$ file» вместо просто $file.

  2. . Для дополнительной надежности -printf '\0' и read -d $'\0' используют символы NUL в качестве разделителей, чтобы даже имена файлов со встроенными символами новой строки '\n'будет работать.

7 голосов
/ 21 января 2011
find files/ -name '.*' -printf '%f\n'|while read f; do
        mv "files/$f" "files/${f#.}"
done
1 голос
/ 21 января 2011
  1. Этот скрипт работает с любым файлом, который вы можете выбросить в него, даже если в их имени есть пробелы, символы новой строки или другие гнусные символы.
  2. Он работает независимо от того, сколько подкаталогов находится глубокоскрытый файл -
  3. В отличие от других ответов, вы не должны изменять остальную часть сценария, когда вы изменяете путь, заданный на find

* Примечание: я включил echo, чтобы вы могли проверить его как на пробном пуске.Удалите сингл echo, если вы удовлетворены результатами.

find . -name '.*' -exec sh -c 'for arg; do d="${arg%/*}"; f=${arg:${#d}}; echo mv "$arg" "$d/${f#.}"; done' _ {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...