Создайте копии файлов в том же каталоге

[1183380] Если вы создаете каталоги только с помощью команды [1183664]mkdir[1183665] в командной строке оболочки, вы можете иметь:

в файле настройки оболочки ([1183666]~/.zshrc[1183667] для [1183668]zsh[1183669], [1183670]~/.bashrc[1183671] для [1183672]bash[1183673] ...).

root (hd0,2)
kernel /kernel-genkernel [...] real_root=/dev/sda4 ro
initrd /initramfs [...]
boot
Это означает, что маска установлена на 7, но переопределите [1183674]mkdir[1183675] на функцию, где вызывается реальная [1183676]mkdir[1183677] (с теми же аргументами ([1183678] "$@"[1183679])) с маской 2. (обратите внимание, что [1183680](...)[1183681] создает подоболочку, поэтому маска [1183682]umask 2[1183683] применяется только внутри этой функции).[1183385].
1
04.02.2015, 10:48
4 ответа

В простом стиле Unix вам нужно будет закрутить файлы:

for file in 1.txt 2.txt 3.txt; do cp -pi "$file" "${file%.*}(1).txt"; done

$ {File%. *} Удаляет расширение из имени файла, затем (1 ) .txt Добавляет номер и восстанавливает расширение. Варианты CP Подскажите, если цель уже существует ( -I и сохраняет разрешения ( -P ).

Большинство систем Linux будут иметь пакет MMV ; Это позволяет просто делать

mcp '*.txt' '#1(1).txt'

это копирует каждый файл, заканчивающийся в .txt в новый файл, соответствующий первой подстановочнойкарке ( # 1 ) и добавления (1) .txt . С скобками не нужно сбежать здесь, потому что они в кавычках.

В качестве альтернативы, если вы используете графический менеджер файлов, вы можете сделать точно так же, как и в Windows.

4
27.01.2020, 23:13

Это кажется тривиальным в Windows, просто выделите кучу файлов

. Я вещь тривиально в различных менеджерах файлов GUI в Linux, но вам нужно решение Shell, верно? Вот оно:

for F in *; do cp -p "$F" "${F%.*}\(1\).${F#*.}"; done

$ {F%. *} извлекает часть имени файла перед точкой, а $ {F # *.} Удлинитель извлечения.

1
27.01.2020, 23:13
set ./*.txt
while    [ -e "$1" ] || [ -L "$1" ]
do       case ${1##*(} in ($1|*[!0-9]*\)|\)*)
         cp "$1" "${1%.*}(1).txt";;
         (*\)*) set "${1##*(}" "$@"; cp \
         "$2" "${2%"$1"}$((${1%)*}+1))).txt"
         shift;; esac
shift;   done

, что должно обрабатывать все случаи довольно хорошо, я думаю. При необходимости появится (копирование) (копирование) [11300881] (копирование) , но в противном случае будет просто вставить (1) между расширением и именем файла.

1
27.01.2020, 23:13

В zsh, wildcard move или copy поставляется с оболочкой:

autoload zmv
zmv -C '(*).txt' '$1 (1).txt'

Но я бы действительно не советовал использовать для этой цели пробел в имени файла, и скобки также не идеальны. Я упоминаю об этом, потому что каждый раз, когда я сталкиваюсь с подобным шаблоном (например, x.txt и x (1).txt и x (2). txt) и я хочу сделать завершение табуляции без двойных кавычек, я должен написать x ( 1 ), чтобы все получилось правильно. Также, это выглядит запутанным в выводе ls, потому что не совсем понятно, где заканчиваются имена файлов. Я бы использовал x.txt, x.1.txt и x.2.txt. Таким образом, имена файлов визуально аперируют как единицы измерения, и это завершение работает: x <таб> .1 <таб>.

1
27.01.2020, 23:13

Теги

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