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

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

何千ものテキストファイル名をテキストファイルの最初の単語とファイル拡張子(.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、デバイス、およびその他の非従来型のファイルをスキップ)

答え2

現在ではvim次のことを行います(汚れても)。

:$!ls *.txt.txtこれにより、ディレクトリ内のすべてのファイルのリストが表示されます。

:%norm A `sed 1q < | cut -f1 -d' '`

これは、ファイルの最初の単語(またはスペースが続く最初の単語、[通常同じと見なされます])を取得するコマンドテンプレートを追加し、すばやく完了します。

:%norm 0vf yf<p以前に作成したリストからファイル名を取得して貼り付けます。<

:%norm Imv˽各行の先頭に移動コマンドとスペースを追加します。

:w command.shこれchmod +x command.shを渡して実行できるスクリプトとして保存します。./command.sh

警告する:

衛生はまったく行われませんでした。つまり、ファイルの最初の単語が一意の名前であることを確認しません。これはあなたの申請書に従って提供することができますが、通常はそうではありません。したがって、ファイル名をその内容の最初の単語に変更すると、ファイルが互いに上書きされる可能性があります。したがって、これはお勧めできません。

関連情報