特定の長さのファイル名を持つすべてのファイルをコピーする

特定の長さのファイル名を持つすべてのファイルをコピーする

ディレクトリ内の/sourceファイル名が15文字を超えるすべてのファイルをディレクトリにコピーしたいと思います/dest。これを行うUNIXコマンドはありますか?

編集する:しかしこの問題特定の長さのファイル名を取得する方法について説明し、ファイルをコピーする方法も質問しました。

答え1

私が知っている限り、これを行うための特別なコマンドはありませんが、シェルグローブモードを利用できます。

cp /source/????????????????* /dest

持つ16アスタリスクの前に疑問符(「15文字以上」が必要です。これは「最小16文字」を意味します)。

私の現在の回答に関する注意事項は次のとおりです。

  • シェル構成によっては、「隠された」ファイル(たとえば、.ドット()で始まるファイル)はコピーされないことがあります。
  • 直接サブディレクトリはコピーされません/source。各ファイル名が15文字を超えるディレクトリに対してのみ警告を表示します。すべてを再帰的にコピーし/sourceて階層を維持したい場合、この答えはより複雑です。

答え2

16文字以上の文字を含むパターンを作成し、そのファイルをコピーできます。

16文字を使用する簡単でエレガントではない方法は、?各文字が単一の文字と一致します。

for n in /source/????????????????*;do [ -f "$n" ] && cp "$n" /dest/; done

16番目以降は?任意*数の文字と一致します。パターンが実際にどんなものとも一致しない可能性があるため、まだファイルであることを-f確認するためにテストする必要があります。

答え3

この?????????????????????解決策は、あなたが私のように8まで数えることができない人でなければ素晴らしいです。この場合、以下を使用できますfind

find . -maxdepth 1 -regextype posix-egrep -regex '.{17,}' -exec cp -t /dest {} +
  • を使用するときは、前の内容を17考慮する必要があります./
  • -regextype posix-egrep中かっこモードを許可する必要があります{}。デフォルトの正規表現の種類findは次のとおりです。Emacsこれはこれを許可しません。
  • cpすべての出力がソース-tとして処理されるように、ターゲットを最初の引数(オプション)として配置する必要があります。{} +

答え4

GNUとGawkを含むLinuxシステムに言及している場合は、次の解決策があります。ソースはであり、ファイル名にスペースが含まれていないと仮定し、7文字より長いファイル名/home/my_folderにコピーされます。/dest

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'

任意の出力:

cp /home/my_folder/orbit-antixcat /dest/orbit-antixcat;
cp /home/my_folder/spacefm-antixcat-569be3dc.tmp /dest/spacefm-antixcat-569be3dc.tmp;
cp /home/my_folder/xsession-modified-date /dest/xsession-modified-date;

問題がなければ、シェルにパイプして実際にファイルをコピーします。

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'|bash

名前にスペースを含むファイルを収容するために、いくつかの引用符を追加できます。

ls /home/my_folder |awk '{if(length($0)>7){print "cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

引用された出力の例:

cp '/home/my_folder/kdecache-antixcat' '/dest/kdecache-antixcat';
cp '/home/my_folder/ksocket-antixcat' '/dest/ksocket-antixcat';

エイリアスがある場合は、cpバイナリを指定できます。おそらく不要な上書きの確認があるでしょう。

ls /home/my_folder |awk '{if(length($0)>2){print "/bin/cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

必要に応じてディレクトリをコピーするように上記の内容を変更できます。現在は省略しています。

関連情報