LINUX.ORG.RU
ФорумAdmin

cp, mv, rm скрытые файлы


0

1

Есть такой обломчик замечательный:

cp -pr /some/path/src/* /some/path/dst
Думаете вы скопировали все файлы ? Фигушки. Все папки и файлы типа .hg, .env и другие скрытые не скопировались. То же самое относится и к mv и rm

Т.е rm -r /some/path/src/* оставит в директории папки и файлы начинающиеся с точки не будут удалены.

В жабке я поспрашивал у знакомых, какие есть варианты универсальные для этого ?

1) cp. Есть универсальное решение:

cp -prT /some/path/src/* /some/path/src/*
сделает то, что нужно

2) mv. Аналогично cp

3) с rm сложнее:

rm -r /some/path/src/{*,.*}
удалит все файлы, но два раза ругнётся на . и ..

find /some/path/src  | tail -n +2 | xargs rm -r

тоже сделает то, что нужно, но ворнингов будет десятки т.к(сами посмотрите почему)

У меня есть деплой на питоне, в котором выполняемые команды, если они выполнились нормально не показываются в аутпут, но если команда сбоит, то она в аутпут показывается. Получается так, что в аутпут у меня из-за . и .. будет ворнинг. Мне надо или вообще убирать вывод(любой) команды rm из аутпут или смотреть на левые ворнинги. Что посоветуете ? Как удалить все файлы в директории, при этом не напороться на ворнинги ?

★★★★

Последнее исправление: bryak (всего исправлений: 3)

rm -r /some/path/src/{*,.*} 2>/dev/null

yacuken ★★★★
()

на питоне, в котором выполняемые команды

import os
try:
  os.removedirs(os.listdir('/some/path/src'))
except:
  pass
anonymous
()
find -delete

И никаких извратов с xargs.

anonymous
()

Все папки

А как же мамки? Про мамки ты забыл, малыш?!

anonymous
()

универсальное решение: cp -prT /some/path/src/* /some/path/src/*

Ага, которое само угадает, что нужно в /some/path/dst писать. Думаю, что ваше универсальное решение должно выглядеть как:

cp -a -T /some/path/src /some/path/dst

По поводу ″find″ вам уже написали, чтобы каталог ″/some/path/src″ не удалялся нужно:

find /some/path/src -mindepth 1 -delete

И если у вас много файлов, то вобще использовать в нормальном скрипте ″*″ не вариант, так как можете получить ограничение на длину командной строки.

P.S. ЕМНИМ, когда то давно ″rm -rf .*″ не ругалось про ″..″, а честно рекурсивно удаляло всё в родительском каталоге.

mky ★★★★★
()

В bash можно сделать:

shopt -s dotglob
В zsh:
setopt globdots
Кроме того, в zsh {*,.*} не будет выдавать . и .., поэтому можно так использовать без проблем.

proud_anon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.