次のファイルを含むディレクトリがあるとします。
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.txt
andx (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>
。