Перемещение только тех файлов, которые отображаются в списке

У меня есть список некоторых имен / идентификаторов, и в том же каталоге у меня есть исходные файлы из этого списка. Я пытаюсь найти, как я могу перемещать исходные файлы в другую папку, но только те, которые появляются в списке?

Итак, мой файл list / txt выглядит так:

2mtz.pdb 2lbq.pdb 2kad.pdb

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

3
задан 18 January 2018 в 20:44

6 ответов

В Unix, если мы стараемся, имена файлов могут иметь всевозможные неожиданные символы. По возможности мы обычно избегаем использования пробелов: «?», «\ N», «(», «*» и т. Д. В именах файлов и каталогах.

Если ваши имена файлов не имеют «пробелов» и других странные символы, попробуйте:

mv $(cat list/txt) destination/dir/
2
ответ дан 17 July 2018 в 22:52

Если список находится в файле /tmp/list.txt, вы можете сделать следующее:

cat /tmp/list.txt | xargs mv -t /app/dest/

или короче:

xargs mv -t /app/dest/ < /tmp/list.txt

Является комбинацией команд:

mv -t /app/dest/

Чтобы переместить все аргументы SOURCE в DIRECTORY с помощью опции -t или --target-directory = DIRECTORY

И с помощью команды xargs, которые выполняют командные строки из стандартного input, но в этом случае каждая строка на /tmp/list.txt, потому что мы сделали перенаправление, используя кредит <

для этого другого Q & amp; A https://unix.stackexchange.com/questions/115734/ въезд файла-по-список-в-файл-с-выводной пробельным

3
ответ дан 17 July 2018 в 22:52

Вот два примера, которые используют цикл while.

В следующем примере содержимое файла с именем list будет перенаправлено в цикл while, где каждая строка будет read как значение переменная $FILE_NAME, которая будет использоваться в качестве аргумента в команде mv.

while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done < /path/to/list

В следующем примере команда cat выведет содержимое файла с именем list. Выход будет передан в контур while, где каждая строка будет read в качестве значения переменной $FILE_NAME, которая будет использоваться как аргумент в команде mv.

cat /path/to/list | while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done

ИМО с использованием перенаправления - лучший способ. Ниже приведено более подробное объяснение этого использования while: while цикл обрабатывает только первую запись команды ssh.

2
ответ дан 17 July 2018 в 22:52

В Unix, если мы стараемся, имена файлов могут иметь всевозможные неожиданные символы. По возможности мы обычно избегаем использования пробелов: «?», «\ N», «(», «*» и т. Д. В именах файлов и каталогах.

Если ваши имена файлов не имеют «пробелов» и других странные символы, попробуйте:

mv $(cat list/txt) destination/dir/
2
ответ дан 24 July 2018 в 13:28
  • 1
    Они не имеют. Все они номера, за которыми следуют три символа буквы, но без пробелов! – milan 16 January 2018 в 22:13
  • 2
    Я хотел бы добавить, что разделитель путей / не разрешен, во всяком случае, в именах файлов. Этот и нулевой байт являются единственными символами, запрещенными в именах файлов Unix. – Stefan Hamcke 16 January 2018 в 22:24
  • 3
    @StefanHamcke, спасибо за исправление. Это имеет смысл! (Я починю это) – JJoao 17 January 2018 в 02:09
  • 4
    @StefanHamcke Да, это правда; всякий раз, когда я запускаю скрипт, а вход - это файл с некоторыми из этих символов. Его нельзя читать. – milan 17 January 2018 в 05:36
  • 5
    @milan, представленная команда применима только к известному разумному контенту! Во враждебной среде это явно небезопасно !! (ex: список файлов, содержащий команду «f; command» - comand, будет выполнен) – JJoao 17 January 2018 в 12:23

Если список находится в файле /tmp/list.txt, вы можете сделать следующее:

cat /tmp/list.txt | xargs mv -t /app/dest/

или короче:

xargs mv -t /app/dest/ < /tmp/list.txt

Является комбинацией команд:

mv -t /app/dest/

Чтобы переместить все аргументы SOURCE в DIRECTORY с помощью опции -t или --target-directory = DIRECTORY

И с помощью команды xargs, которые выполняют командные строки из стандартного input, но в этом случае каждая строка на /tmp/list.txt, потому что мы сделали перенаправление, используя кредит <

для этого другого Q & amp; A https://unix.stackexchange.com/questions/115734/ въезд файла-по-список-в-файл-с-выводной пробельным

3
ответ дан 24 July 2018 в 13:28
  • 1
    Хм, я нашел, что мой ответ также предоставляется в рамках указанной вами ссылки :) Было бы неплохо добавить некоторые объяснения того, что на самом деле делает xargs. Независимо от того, связана ли опция -t с командой mv или связана с xargs. – pa4080 16 January 2018 в 21:19
  • 2
    ОК, отредактированный, чтобы улучшить ответ, но весь кредит для оригинального Q & amp; A. – manuti 17 January 2018 в 03:10

Вот два примера, которые используют цикл while.

В следующем примере содержимое файла с именем list будет перенаправлено в цикл while, где каждая строка будет read как значение переменная $FILE_NAME, которая будет использоваться в качестве аргумента в команде mv.

while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done < /path/to/list

В следующем примере команда cat выведет содержимое файла с именем list. Выход будет передан в контур while, где каждая строка будет read в качестве значения переменной $FILE_NAME, которая будет использоваться как аргумент в команде mv.

cat /path/to/list | while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done

ИМО с использованием перенаправления - лучший способ. Ниже приведено более подробное объяснение этого использования while: while цикл обрабатывает только первую запись команды ssh.

2
ответ дан 24 July 2018 в 13:28

Другие вопросы по тегам:

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