テキストファイル名を各テキストファイルの最初の単語にまとめる方法は?

テキストファイル名を各テキストファイルの最初の単語にまとめる方法は?

何千ものテキストファイル名をテキストファイルの最初の単語とファイル拡張子(.txt)に変更するには、端末を使用する必要があります。すべてのファイルはディレクトリにあり、現在「xx0001.txt」から「xx9999.txt」までのパターンで名前が付けられています。

各ファイルの最初の単語は「##221251」パターンです。したがって、ポンド記号をコメントアウトする必要がある場合に問題が発生した可能性があります。

私は試した:

rename File.ReadAllText('*.txt').split(' ')[0]

エラーが発生します。

zsh: no matches found: File.ReadAllText(*.txt).split( )[0]

助けてくれてありがとう。私は本物の初心者です。

ベストアンサー1

単語がSPC、TAB、またはNULで区切られ、最初の単語が最初の行にあるとし、次のことを試してください。

for file (*.txt) {
  read -r word rest < $file && mv -i -- $file $word.txt
}

SPCにのみ分割するには、readに置き換えますIFS=' ' read

このコードがどの言語で書かれたかはわかりませんが、構文はrename File.ReadAllText('*.txt').split(' ')[0]確かにありませんzsh(私が知っている他のシェルの構文でもありません)。

zshコードが何をするのかをより直接的に翻訳すると、次のようになります。

for file (*.txt) mv -i -- $file ${$(<$file)[1]}

メモリ内のファイル全体を読み込んで分割しますが、エラーチェックはあまり行いません。分割はSPC、TAB、NULまたはNLで行われ、最初の行の最初に限定されません。

迅速に実行するには、zmodload zsh/filesコマンドを組み込みmvバージョンに置き換える事前実行を実行できます(呼び出し時に高価なフォークと実行可能ファイルを節約します)。

renameperlそれ自体は少なくとも1980年代からリリースされたサンプルプログラムの名前です。パラメーターは、perl代替名を計算するために使用されるコードです。すべてのシステムでこのrenameコマンドが提供されるわけではなく、一部のシステムではrenameまったく異なります。あなたがこの人ならrenameperlこれを行うことができます:

rename '
  if (open FILE, "<", $_ and my $line = <FILE>) {
    chomp $line;
    my @words = split " ", $line;
    $_ = "$words[0].txt" if @words;
  }' ./*.txt

perlこれには、内部コンテンツが言語コードとしてそのまま渡されるように単一引用符が使用されていますperl

*.txt次に、変更または*.txt(.)検討*.txt(-.)することもできます。定期的なファイル(ディレクトリ、fifo、デバイス、およびその他の非従来型のファイルをスキップ)

おすすめ記事