同じディレクトリにファイルのコピーを作成します。

同じディレクトリにファイルのコピーを作成します。

次のファイルを含むディレクトリがあるとします。

1.txt 2.txt 3.txt

私はこれをコピーして基本的に同じディレクトリに貼り付け、次のような新しいファイルを作成したいと思います。

1.txt 1(1).txt 2.txt 2(1).txt 3.txt 3(1).txt

これは思ったより難しいですね!これはWindowsでは簡単に見えます。複数のファイルを強調表示してコピー/貼り付けすると、同じファイルが作成されますが、名前に「コピー」が追加されます。

答え1

一般的な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と同じ操作を実行できます。

答え2

これはWindowsではマイナーなようです。ただ複数のファイルを強調表示するだけです。

私はこれがLinuxのさまざまなGUIファイルマネージャの間でもマイナーなことだと思いますが、シェルソリューションが必要です。そうですか?ここにいる:

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

${F%.*}ファイル名の中間の前部分を抽出し、${F#*.}拡張子も抽出します。

答え3

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

私はこれがすべての状況をうまく処理する必要があると思います。それは増加するでしょう(コピー)必要に応じて番号 - それ以外の場合は1つだけ挿入されます。(1)拡張子とファイル名の間にあります。

答え4

では、zshワイルドカードの移動またはコピーがシェルに付属しています。

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

ただし、この目的のためにファイル名にスペースを使用しないことをお勧めし、括弧も理想的ではありません。このようなパターン(例えば、x.txtandx (1).txtや)を見つけ、二重引用符なしでタブを完成したいときはいつでも正しくx (2).txt書く必要があるので、これについて言及します。x <tab> <backslash> <space> <backslash> ( 1 <tab>また、lsファイル名が終わる場所が明確ではないため、出力で混乱しているようです。私はx.txt、とx.1.txtを使用しますx.2.txt。これにより、ファイル名が視覚的に単一の単位で表示され、次の補完が正しく機能しますx <tab> .1 <tab>

関連情報