Копировать / Вставить код цикла

Это работает в Fish Shell

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end
4
задан 30 October 2017 в 19:32

6 ответов

Предполагая, что:

Папки, которые нужно скопировать, и их файлы находятся под /home/gcgm/myfolders Выходная папка /tmp/output-folder

Если вам нужно скопировать все файлы в другую папку , вы можете сделать следующее:

mkdir /tmp/output-folder
cd /home/gcgm/myfolders
cp */* /tmp/output-folder

Значение */* in the this command cp / target`:

Папки, которые должны быть скопированы и их файлы находятся под /home/gcgm/myfolders
5
ответ дан 22 May 2018 в 16:58
  • 1
    Будет ли это работать как цикл через каждую папку? Я записал свой путь, так что для нового пользователя linux мне будет проще, как мне – GCGM 30 October 2017 в 18:57
  • 2
    если скопировать все файлы во все папки под текущей папкой, в папку-выход, это решение не использует цикл. – Yaron 30 October 2017 в 18:58
  • 3
    он отлично работает. Не могли бы вы просто объяснить, что делает последняя строка вашего кода? Что cp */*? – GCGM 30 October 2017 в 19:04
  • 4
    просто интересно, можно ли вырезать - вставить вместо copy-paste? – GCGM 30 October 2017 в 20:06
  • 5
    @GCGM, замените cp на mv для вырезания. – JoL 30 October 2017 в 20:12

Предполагая, что:

Папки, которые нужно скопировать, и их файлы находятся под /home/gcgm/myfolders Выходная папка /tmp/output-folder

Если вам нужно скопировать все файлы в другую папку , вы можете сделать следующее:

mkdir /tmp/output-folder cd /home/gcgm/myfolders cp */* /tmp/output-folder

Значение */* in the this command cp / target`:

Папки, которые должны быть скопированы и их файлы находятся под /home/gcgm/myfolders
5
ответ дан 18 July 2018 в 04:15

Предполагая, что:

Папки, которые нужно скопировать, и их файлы находятся под /home/gcgm/myfolders Выходная папка /tmp/output-folder

Если вам нужно скопировать все файлы в другую папку , вы можете сделать следующее:

mkdir /tmp/output-folder cd /home/gcgm/myfolders cp */* /tmp/output-folder

Значение */* in the this command cp / target`:

Папки, которые должны быть скопированы и их файлы находятся под /home/gcgm/myfolders
5
ответ дан 24 July 2018 в 18:02

В соответствии с вашим примером ваш целевой каталог не содержит цифр, в то время как все ваши исходные каталоги. Таким образом, вы можете просто использовать (GNU) cp, как показано ниже в родительском каталоге, в bash:

shopt -s dotglob  #Enables matching hidden files with glob patterns
shopt -s globstar #Enables recursive traverse of directories
cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/*
cp копирует -t zPASTE_EVERYTHING_HERE устанавливает целевой каталог *[[:digit:]]*/**/* сопоставляет каталоги, содержащие хотя бы цифру, пересекает их (на любой глубине тоже) и получает все.

Выполнение всего в подоболочке, чтобы сохранить родительскую оболочку неповрежденной; из родительского каталога:

( shopt -s dotglob && shopt -s globstar && \
    cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* )

Теперь, для любого произвольного имени каталога назначения, установите каталог как переменную GLOBIGNORE:

GLOBIGNORE=whatever_destination

Теперь , вы можете просто сделать:

cp -t whatever_destination */**/*

или вы можете использовать extglob:

shopt -s extglob #Should be already set on any interactive shell session
cp -t whatever_destination !(whatever_destination)/**/*

Дополнительная заметка:

[d14 ] Существует вероятность срабатывания функции ARG_MAX, если у вас много файлов / каталогов внутри исходных каталогов, в этом случае у вас есть два варианта:

cp выполняет копирование [!d2 ] Используйте find:
find . -mindepth 1 -maxdepth 1 -type d -not -name whatever_destination \
    -name '*' -exec sh -c 'cp -rt whatever_destination "$1"/*' _ {} \;
6
ответ дан 22 May 2018 в 16:58
  • 1
    Спасибо за ответ. Это тоже работает. Просто интересно, повлияет ли на ваш адрес цифра в папке назначения? Пока это случайное имя – GCGM 30 October 2017 в 19:10
  • 2
    @GCGM Да, проверьте мои изменения. – heemayl 30 October 2017 в 19:46

В соответствии с вашим примером ваш целевой каталог не содержит цифр, в то время как все ваши исходные каталоги. Таким образом, вы можете просто использовать (GNU) cp, как показано ниже в родительском каталоге, в bash:

shopt -s dotglob #Enables matching hidden files with glob patterns shopt -s globstar #Enables recursive traverse of directories cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* cp копирует -t zPASTE_EVERYTHING_HERE устанавливает целевой каталог *[[:digit:]]*/**/* сопоставляет каталоги, содержащие хотя бы цифру, пересекает их (на любой глубине тоже) и получает все.

Выполнение всего в подоболочке, чтобы сохранить родительскую оболочку неповрежденной; из родительского каталога:

( shopt -s dotglob && shopt -s globstar && \ cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* )

Теперь, для любого произвольного имени каталога назначения, установите каталог как переменную GLOBIGNORE:

GLOBIGNORE=whatever_destination

Теперь , вы можете просто сделать:

cp -t whatever_destination */**/*

или вы можете использовать extglob:

shopt -s extglob #Should be already set on any interactive shell session cp -t whatever_destination !(whatever_destination)/**/*

Дополнительная заметка:

Существует вероятность срабатывания функции ARG_MAX, если у вас много файлов / каталогов внутри исходных каталогов, в этом случае у вас есть два варианта:

cp выполняет копирование Используйте find: find . -mindepth 1 -maxdepth 1 -type d -not -name whatever_destination \ -name '*' -exec sh -c 'cp -rt whatever_destination "$1"/*' _ {} \;
6
ответ дан 18 July 2018 в 04:15

В соответствии с вашим примером ваш целевой каталог не содержит цифр, в то время как все ваши исходные каталоги. Таким образом, вы можете просто использовать (GNU) cp, как показано ниже в родительском каталоге, в bash:

shopt -s dotglob #Enables matching hidden files with glob patterns shopt -s globstar #Enables recursive traverse of directories cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* cp копирует -t zPASTE_EVERYTHING_HERE устанавливает целевой каталог *[[:digit:]]*/**/* сопоставляет каталоги, содержащие хотя бы цифру, пересекает их (на любой глубине тоже) и получает все.

Выполнение всего в подоболочке, чтобы сохранить родительскую оболочку неповрежденной; из родительского каталога:

( shopt -s dotglob && shopt -s globstar && \ cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* )

Теперь, для любого произвольного имени каталога назначения, установите каталог как переменную GLOBIGNORE:

GLOBIGNORE=whatever_destination

Теперь , вы можете просто сделать:

cp -t whatever_destination */**/*

или вы можете использовать extglob:

shopt -s extglob #Should be already set on any interactive shell session cp -t whatever_destination !(whatever_destination)/**/*

Дополнительная заметка:

Существует вероятность срабатывания функции ARG_MAX, если у вас много файлов / каталогов внутри исходных каталогов, в этом случае у вас есть два варианта:

cp выполняет копирование Используйте find: find . -mindepth 1 -maxdepth 1 -type d -not -name whatever_destination \ -name '*' -exec sh -c 'cp -rt whatever_destination "$1"/*' _ {} \;
6
ответ дан 24 July 2018 в 18:02
  • 1
    Спасибо за ответ. Это тоже работает. Просто интересно, повлияет ли на ваш адрес цифра в папке назначения? Пока это случайное имя – GCGM 30 October 2017 в 19:10
  • 2
    @GCGM Да, проверьте мои изменения. – heemayl 30 October 2017 в 19:46

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

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