Перечислите все каталоги, которые НЕ имеют файла с данным именем файла внутри

Предупреждение, стена текстового поступления. Это также отформатировано, поскольку я мог сделать его.

Если мы собираемся ответить на это, мы собираемся ответить на все это. Я не делаю другого ответа на этом, таким образом, здесь идет:

Давайте притворимся, что Вы абсолютно ничего не знаете, и я питаюсь, Вы нажимаете.
Это говорит Вам все, что необходимо знать, чтобы сделать эту ЦЕЛУЮ вещь с немного этого и добавленным. Действительно, читать.
Вы могли иметь путем чтения, что, прибыл в:
Загрузите Ubuntu 11.10 как живую.

Откройте терминал. Размеры, которые я использую, идут 40G виртуальный диск. Мы делаем это все как root

sudo su
apt-get install lvm2
fdisk /dev/sda
  n
  p
  1
  [enter]
  +1000M
  t
  83
  n
  [enter]
  [enter]
  t
  2
  8e
  w

Что означает, открытый dev/sda, новый основной раздел в положении 1 размера не менее чем 1000 МБ с типом ext3 или лучше, новый основной раздел в положении 2 типа LVM и запись к диску.

Поскольку я обстоятельно объяснил его, я собираюсь предположить, что Вы выполняете ту установку ТОЧНО.

Мы будем использовать/dev/sda1 для начальной загрузки / и/dev/sda2 для ВСЕГО ОСТАЛЬНОГО. Можно изменить размеры для удовлетворения установке без операционной системы, но это было, чтобы VM ответил вопрос.

pvcreate /dev/sda2
vgcreate iammaster /dev/sda2
lvcreate --name lvubuntu --size 10G iammaster
lvcreate --name lvhome --size 12G iammaster
lvcreate --name lvyouarestudent --size 13G iammaster
lvcreate --name lvswap --size 4G iammaster

Это говорит, создают физический том на/dev/sda2, группе объема имени iammaster на/dev/sda2, и логических томах lvubuntu, lvhome, lvyouarestudent, и lvswap на группе объема iammaster.

lvdisplay iammaster

Только проверить. Затем формат...

cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/mapper/iammaster-lvyouarestudent
YES
*passphrase twice*
cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/mapper/iammaster-lvhome
YES
*passphrase twice*
cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/mapper/iammaster-lvswap
YES
*passphrase twice*
cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/mapper/iammaster-lvubuntu
YES
*passphrase twice*

Оки-doke. Теперь Вы зашифровали LVM. Смонтируйте свои разделы склепа.

cryptsetup luksOpen /dev/mapper/iammaster-lvswap swap  
*enter passphrase*
cryptsetup luksOpen /dev/mapper/iammaster-lvubuntu ubuntu  
*enter passphrase*
cryptsetup luksOpen /dev/mapper/iammaster-lvhome home
*enter passphrase*

И подкачка форматирования и включения...

mkswap /dev/mapper/swap
swapoff -a
swapon /dev/mapper/swap

mkfs.ext4 /dev/mapper/ubuntu
mkfs.ext4 /dev/mapper/home

Установка на (пользовательский) нормальный и не перезагружает. Обратите внимание, что необходимо сделать нестандартную установку и двойной щелчок к на логических томах для выбора FS-Type и точки монтирования. Не забывайте/dev/sda1 как начальную загрузку. Мы затем нажимаем установку теперь. После того, как несколько продолжаются, Вы на пути. Щелчок продолжает тестировать НЕ, перезапускают теперь.
enter image description here
Подготовьте каталоги

mkdir /mnt/ubuntu
mount /dev/mapper/ubuntu /mnt/ubuntu  

Смонтируйте специальные файловые системы и начальную загрузку

mount --bind /dev /mnt/ubuntu/dev  
mount --bind /proc /mnt/ubuntu/proc  
mount --bind /sys /mnt/ubuntu/sys  
mount /dev/sda1 /mnt/ubuntu/boot

И chroot/install lvm/crypt

chroot /mnt/ubuntu  
apt-get install cryptsetup lvm2 dmsetup  

Затем нам нужен crypttab, таким образом, мы только разблокировали наши диски однажды

ubuntu /dev/mapper/iammaster-lvubuntu none luks
home /dev/mapper/iammaster-lvhome /etc/home.key luks
swap /dev/mapper/iammaster-lvswap /dev/urandom swap,cipher=aes-cbc-essiv:sha256

cat /etc/crypttab
cat /etc/fstab
*make sure everything matches*  
dd if=/dev/urandom of=/etc/home.key bs=256 count=1
cryptsetup luksAddKey /dev/mapper/iammaster-lvhome /etc/home.key
*enter passphrase*

Теперь для initramfs

*edit /etc/initramfs-tools/modules*
aes-i586
dm-crypt
dm-mod
sha256

update-initramfs -k all -c
update-grub2
grub-install /dev/sda

init 6

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

startx
*open terminal*
vgchange -a y
cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/mapper/iammaster-lvswap
YES
*passphrase twice*
cryptsetup luksOpen /dev/mapper/iammaster-lvswap swap  
*enter passphrase*
mkswap /dev/mapper/swap
swapoff -a
swapon /dev/mapper/swap    
cryptsetup luksOpen /dev/mapper/iammaster-lvubuntu ubuntu  
*enter passphrase*
cryptsetup luksOpen /dev/mapper/iammaster-lvhome home
*enter passphrase*
cryptsetup luksOpen /dev/mapper/iammaster-lvyouarestudent bt
*enter passphrase*
mkfs.ext4 /dev/mapper/bt

Установка указывает руководство, указывает точки монтирования (совместно использовал начальную загрузку / также. если Вы используете один позади/стабильный Ubuntu и края BT, это не должна быть проблема с избиением..., если Вы все еще заинтересованы, добавьте другой раздел начальной загрузки), не форматировать. На шаге 8, усовершенствованном
enter image description here
Когда это заканчивается, продолжают тестировать снова, точно так же, как прошлый раз:
enter image description here Подготовьте каталоги

mkdir /mnt/bt
mount /dev/mapper/bt /mnt/bt
mkdir /mnt/tempmount  
mount /dev/mapper/ubuntu /mnt/tempmount
cp /mnt/tempmount/etc/home.key /mnt/bt/etc/home.key

Смонтируйте специальные файловые системы и начальную загрузку

mount --bind /dev /mnt/bt/dev  
mount --bind /proc /mnt/bt/proc  
mount --bind /sys /mnt/bt/sys  
mount /dev/sda1 /mnt/bt/boot

И chroot/install lvm/crypt

chroot /mnt/bt  
apt-get install cryptsetup lvm2 dmsetup  

Затем нам нужен crypttab, таким образом, мы только разблокировали наши диски однажды

bt /dev/mapper/iammaster-lvyouarestudent none luks
home /dev/mapper/iammaster-lvhome /etc/home.key luks
swap /dev/mapper/iammaster-lvswap /dev/urandom swap,cipher=aes-cbc-essiv:sha256

cat /etc/crypttab
cat /etc/fstab
*make sure everything matches*  

Теперь для initramfs

*edit /etc/initramfs-tools/modules*
aes-i586
dm-crypt
dm-mod
sha256

update-initramfs -k all -c    
init 6

Перезагрузка к человечности живые медиа

sudo su
apt-get install lvm2
vgchange -a y
cryptsetup luksOpen /dev/mapper/iammaster-lvubuntu ubuntu
*passphrase*
mkdir /mnt/ubuntu
mount /dev/mapper/ubuntu /mnt/ubuntu
*insert the bind steps and mount boot steps from before again*
chroot /mnt/ubuntu
update-initramfs -k all -c
update-grub2
grub-install /dev/sda
init 6

Просто измените/dev/mapper/ubuntu на/dev/mapper/bt и передайте правильные аргументы ядра, и Вы сделаны.

Я перешел к большой проблеме для создания этого учебного руководства. Я надеюсь, что Вы цените его.

*you may have to do this every time BT gets a kernel update*

10
04.08.2013, 03:22
5 ответов

Принятие a find реализация как GNU find это принимает a {} встроенный в аргумент -exec:

$ find . -type d \! -exec test -e '{}/README' \; -print

Пример

Здесь каталоги 1/1 через 5/5 имеют README, другие директора пусты.

$ tree 
.
|-- 1
|   `-- 1
|       `-- README
|-- 10
|   `-- 10
|-- 2
|   `-- 2
|       `-- README
|-- 3
|   `-- 3
|       `-- README
|-- 4
|   `-- 4
|       `-- README
|-- 5
|   `-- 5
|       `-- README
|-- 6
|   `-- 6
|-- 7
|   `-- 7
|-- 8
|   `-- 8
`-- 9
    `-- 9

Теперь, когда мы выполняем эту версию нашего find команда:

$ find . -type d \! -exec test -e '{}/README' \; -print
.
./10
./10/10
./7
./7/7
./9
./9/9
./6
./6/6
./5
./8
./8/8
./4
./1
./3
./2

Ссылки

5
27.01.2020, 20:01
  • 1
    , Как изменить команду для поиска подкаталогов, которые не имеют определенного расширения файла (говорят что *.txt). Изменение README с *.txt, кажется, не работает –  WanderingMind 16.04.2016, 20:20
  • 2
    @WanderingMind - если у Вас есть новый вопрос, спросить это как новое на сайте ;-) –  slm♦ 16.04.2016, 23:53

Можно использовать -exec опция find проверять на файл и затем печатать все результаты, для которых перестала работать проверка.

find /path/to/base -mindepth 1 -maxdepth 1 -type d -exec test -e {}/README \; -o -print
3
27.01.2020, 20:01

Нет необходимости в найти . Просто используйте оболочку:

for d in */; do [ -f "$d"README ] || printf '%s\n' "$d"; done
c/

Если вам нужно, чтобы она была рекурсивной, вы можете использовать (для bash , zsh может сделать это по умолчанию, используйте set -o globstar в ksh93 ):

shopt -s globstar
for d in **/; do [ -f "$d"README ] || printf '%s\n' "$d"; done

(обратите внимание, что точечные файлы по умолчанию исключены).

3
27.01.2020, 20:01

С квалификаторами zsh и glob ( e строка ):

print -rl -- *(/e_'[[ ! -f $REPLY/README ]]'_)

или

print -rl -- *(/^e_'[[ -f $REPLY/README ]]'_)

добавьте D в включить скрытые каталоги:

print -rl -- *(D/e_'[[ ! -f $REPLY/README ]]'_)

/ выбирает только каталоги, а e _ '[[! -f $ REPLY / README]] '_ далее выбирает только те имена каталогов, для которых код оболочки в кавычках возвращает истину , то есть для каждого имени каталога ( $ REPLY ), в которую расширяется глобус * (/) , он запускает [[! -f $ REPLY / README]] и сохраняет имя каталога, если результат истина .
Вторая форма ^ e _'.....'_ использует тот же квалификатор glob, но с отрицанием (но на этот раз условное выражение не отменено: [ [-f $ REPLY / README]] ).


Вышеупомянутое будет возвращать только имена каталогов в текущем каталоге.
Если вы хотите осуществлять рекурсивный поиск (опять же, чтобы включить скрытые каталоги, добавьте квалификатор D ):

print -rl ./**/*(/e_'[[ ! -f $REPLY/README ]]'_)
2
27.01.2020, 20:01

Переносимо, можно сделать:

find. -type d -exec sh -c '
  for dir do
    [ -f "$dir/README" ] || printf "%s\n" "$dir"
  done' sh '{}' +

[ -f file ]проверяет, существует ли файл и подтверждается, что является обычным файлом (после разрешения символической ссылки ).

Если вы хотите проверить, что он существует только (как запись в этом каталоге ), независимо от его типа, вам потребуется :[ -e file ] || [ -L file ], хотя обратите внимание, что вам нужно разрешение на поиск в каталоге для выполнения те тесты. Вы можете добавить несколько тестов [ -x "$dir" ]для учета таких случаев, как:

find. -type d -exec sh -c '
  for dir do
    if [ -x "$dir" ]; then
      [ -f "$dir/README" ] || printf "%s\n" "$dir"
    else
      printf >&2 "Cannot tell for \"%s\"\n" "$dir"
    fi
  done' sh '{}' +

Или, чтобы избежать состояния гонки, с помощьюzsh:

find. -type d -exec zsh -c '
  zmodload zsh/system
  for dir do
    ERRNO=0
    if [ ! -f "$dir/README" ]; then
      if [ "$errnos[ERRNO]" = ENOENT ]; then
        printf "%s\n" "$dir"
      else
        syserror -p "ERROR: $dir/README: "
      fi
    fi
  done' zsh '{}' +

См. также Как определить, что обычный файл не существует в Bash? на SO.

2
20.08.2021, 13:07

Теги

Похожие вопросы