Там какой-либо путь состоит в том, чтобы использовать xargs через канал?

То, что происходит, - то, что vi создает новый файл (inode) и, эффективно, отменяя связывание, даже при том, что монтирование все еще на месте. Добавление использует существующий файл (inode).

Смотрите на inode числа использования файлов ls -li поскольку я ступаю через Ваш тест (тесты).

$ echo foo > foo
$ echo bar > bar
$ ls -li foo bar   # 2 inodes so 2 different files
409617 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 bar
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 foo
$ sudo mount --bind foo bar
$ ls -li foo bar   # both inodes are the same so both reference the same file (foo)
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 bar
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 foo
$ echo mod >> foo
$ ls -li foo bar   # appending doesn't change the inode
409619 -rw-r--r-- 1 derek derek 8 Jul 31 12:57 bar
409619 -rw-r--r-- 1 derek derek 8 Jul 31 12:57 foo
$ vi foo
$ ls -li foo bar   # vi has created a new file called foo (new inode)
                   # bar still points to the old foo
409619 -rw-r--r-- 0 derek derek  8 Jul 31 12:57 bar
409620 -rw-r--r-- 1 derek derek 14 Jul 31 12:57 foo
$ sudo umount bar
$ ls -li foo bar   # umount uncovers the original bar. original foo has no references
409617 -rw-r--r-- 1 derek derek  4 Jul 31 12:56 bar
409620 -rw-r--r-- 1 derek derek 14 Jul 31 12:57 foo

Необходимо думать с точки зрения базового inodes, а не имен файлов. Что Вы пытаетесь сделать, который не мог быть сделан с символьными ссылками?


Я попробовал изменение, и думайте, что можно сделать то, что Вы хотите. Смотрите на следующее...

$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 a/foo
 840457 -r--r--r-- 1 root  root   6 Jul 31 19:41 /mnt/c/foo
$ sudo mount --bind a/foo /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 a/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 /mnt/c/foo
$ vi /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 a/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 /mnt/c/foo
$ sudo umount /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 a/foo
 840457 -r--r--r-- 1 root  root   6 Jul 31 19:41 /mnt/c/foo

В то время как a/foo был смонтирован на файле только для чтения /mnt/c/foo Я мог отредактировать /mnt/c/foo и это изменило содержание a/foo не изменяя inode.

15
30.12.2016, 14:12
2 ответа

Если я понимаю правильно, Вы хотите разжечь один экземпляр flac … | lame … для каждой входной строки, и интерполируют вход в аргументы обеим командам.

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

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

С другой стороны, имейте строки чтения оболочки вызова один за другим и выполните конвейер.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

Обратите внимание что формат %w%f производит полный путь, к которому Вы предварительно ожидаете /media/1tb и добавление .mp3. Если Вы хотите снять изоляцию с части каталога файла в lame команда, изменение $file кому: ${file##*/}. Если Вы хотите снять изоляцию с расширения, изменения $file кому: ${file%.*}. Если Вы хотите сделать обоих, необходимо будет сделать это на двух шагах. Если Вы хотите воспроизвести иерархию каталогов под /media/1tb, можно использовать mkdir -p.

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done
16
27.01.2020, 19:50

Вы могли попробовать что-то как:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;
3
27.01.2020, 19:50
  • 1
    while read … решение, но затем, отбрасывание xargs. Что Вы записали, просто не имеет смысла: где Вы думаете xargs получает его вход? И необходимо заключить вещи в кавычки правильно, именам музыкального файла свойственно содержать пробелы. –  Gilles 'SO- stop being evil' 23.12.2013, 03:33
  • 2
    @Gilles мне точно не было ясно, что делает OP, который является, почему я сказал "Вас, мог попробовать что-то как" и "я не уверен, укусил ли xargs, верно для Ваших намерений" и т.д. Так не лучший ответ, но подсказка в правильном направлении, я думаю. Устранили проблему заключения в кавычки и удалили xargs. –  goldilocks 23.12.2013, 14:28

Теги

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