Linux Bash Script показывает файлы в каталоге

Я пытаюсь сделать скрипт для отображения файлов в каталоге с параметром --unhide, но он не работает. Вы можете мне помочь? Вот моя часть кода.

for i in `ls -1`
do
    if [ -f $i ] || [ -d $i ]
    then
        if [ `echo $i | cut -c1` == "." ]
        then
            mv $i ${i#.}
        fi
    fi
done

Спасибо!

А как насчет показать, то я пишу --показать файл1 файл2?

elif [ $1 = --unhide ] && [ ! $2 = --all ]
then
for i in $@
do
if [ -f $i ] || [ -d $i ]
then
if [ `echo $i | cut -c1` == "." ]
then
mv $i ${i#.}
fi
fi
done    

Это просто, тогда у нас нет скрытых файлов, тогда имя параметра совпадает с именем файла. Но как проверить скрытые файлы? Я пытался написать --unhide .file1 .file2, но скрипт показывает только .file1, а .file2 нет.


person user3168731    schedule 09.11.2014    source источник
comment
Я предполагаю, что конкретная проблема, которую вы видите, связана с тем, что ls -1 не включает скрытые файлы по умолчанию, но у Маттиаса есть гораздо более надежный способ сделать то же самое.   -  person that other guy    schedule 09.11.2014
comment
Если вы не считаете, что использование ls для этой работы по своей сути не работает, попробуйте протестировать некоторые имена файлов, которые содержат пробелы... или, что еще хуже, новые строки.   -  person Charles Duffy    schedule 09.11.2014


Ответы (1)


Итак, в основном то, что вы просите, это скрипт, который переименовывает файлы в каталоге, где файлы начинаются с «.»?

Что-то вроде следующего должно работать

GLOBIGNORE=".:.."
for file in .*; do
   mv -n "$file" "${file#.}"
done
person mattias    schedule 09.11.2014
comment
Я бы, в целях тестирования, сделал echo $file перед запуском полной mv -n штучки, хотя... чтобы быть уверенным, что не наделал ничего глупого. - person mattias; 09.11.2014
comment
Нет необходимости экспортировать GLOBIGNORE. - person Yann Vernier; 09.11.2014
comment
@YannVernier: В OSX я получаю '..' и '.' считается без этой строки. Поэтому я и включил его. Я надеюсь, что он не попытается их переименовать :) Но в чем-то вы правы, это все равно будет работать без GLOBIGNORE. - person mattias; 09.11.2014
comment
Это не символические ссылки (но единственные разрешенные жесткие ссылки на каталоги), и я просто имел в виду, что вам не нужно их экспортировать, а не то, что вы не должны их устанавливать. - person Yann Vernier; 09.11.2014
comment
@YannVernier: Вы правы, отредактировал мой комментарий относительно символической ссылки. - person mattias; 09.11.2014
comment
О, я нашел ошибку в своем собственном коде. LS -1 не видит скрытые файлы, поэтому я исправил с LS -A -1 и теперь он работает правильно :) - person user3168731; 09.11.2014
comment
@user3168731: user3168731: О, хорошо, но, возможно, вам следует рассмотреть возможность использования моего решения в любом случае, меньше строк, о которых нужно заботиться. И пока вы это делаете, я не против, чтобы вы приняли ответ :) - person mattias; 09.11.2014
comment
@mattias, Ян не говорит вам, что вам не нужно устанавливать GLOBIGNORE, но вам не нужно экспортировать его. Просто GLOBIGNORE='.:..' без export будет иметь тот же эффект, но меньше побочных эффектов. - person Charles Duffy; 09.11.2014
comment
@CharlesDuffy: понял, отредактировал код. Спасибо за напоминание! - person mattias; 09.11.2014
comment
@ user3168731, ls не подходит для этой работы, даже с -a. См. mywiki.wooledge.org/ParsingLs. - person Charles Duffy; 09.11.2014