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