9

現在のディレクトリに次のファイルがあるとします。

1.jpg
1original.jpg
2.jpg
2original.jpg
3.jpg
4.jpg

次のようなことを実行できるterminal/bash/linuxコマンドはありますか

if the file [an integer]original.jpg exists,
    then move [an integer].jpg and [an integer]original.jpg to another directory.

このようなコマンドを実行すると、1.jpg、1original.jpg、2.jpg、および2original.jpgがそれぞれのディレクトリに配置されます。

これは1つのコマンドである必要はありません。私は単純なコマンドの組み合わせになることができます。たぶん、元のファイルを新しいディレクトリにコピーするようなものです。次に、newdir内のファイルに対して正規表現フィルターを実行して、まだコピーする必要がある古いディレクトリからのファイル名のリストを取得します。

4

6 に答える 6

6

拡張グロブサポートをオンにすると、正規表現のようなパターンを記述できます。これは、「87.jpg」や「87original.jpg」などの複数桁の整数のファイルを処理できます。次に、Bashパラメータ展開を使用して、見つかったファイルの名前から「元の」ファイルを削除し、2つの関連ファイルを一緒に移動できるようにします。

shopt -s extglob
for f in +([[:digit:]])original.jpg; do
    mv $f ${f/original/} otherDirectory
done

拡張パターンで+( x )は、正規表現と同様に、括弧内の1つ以上のものと一致しますx+。ここに、x任意の数字があります。したがって、名前が1桁以上の後に「original.jpg」が続く現在のディレクトリ内のすべてのファイルを照合します。

${f/original/}bashのパターン置換の例です。の値から文字列「original」の最初の出現を削除しますf。したがって、fが文字列「1original.jpg」の場合、は文字列「1.jpg」${f/original/}です。

于 2012-07-30T20:00:16.180 に答える
3

まあ、直接ではありませんが、それはワンライナーです(編集:もうありません):

for i in [0-9].jpg; do
  orig=${i%.*}original.jpg
  [ -f $orig ] && mv $i $orig another_dir/
done

編集:おそらく私は私の解決策を指摘する必要があります:

  • for i in [0-9].jpg:ファイル名として1つの番号を使用して各jpgファイルのループ本体を実行します。ファイル名全体を$i
  • orig={i%.*}original.jpg$orig「元のファイル」の可能なファイル名で保存
  • [ -f $orig ]:元のファイルが存在するかどうかをtest(1)(もの)で確認してください。はいの場合、両方のファイルをに移動します。これは、テストが成功した場合にのみ実行される後の部分を介して行われます。[ ... ]$ianother_dir&&
于 2012-07-30T19:21:02.947 に答える
2

これは、厳密に数値のプレフィックスに対して機能するはずです。234.jpg

for f in *original.jpg; do
  pre=${f%original.jpg}
  if [[ -e "$pre.jpg" && "$pre" -eq "$pre" ]] 2>/dev/null; then
    mv "$f" "$pre.jpg" targetDir
  fi
done

"$pre" -eq "$pre"整数でない場合はエラーになります

編集:これは、存在し、両方
が存在する場合は失敗します。その場合はnullstringであり、trueです。original.jpg.jpg
$pre"$pre" -eq "$pre"

于 2012-07-30T20:25:01.893 に答える
1

以下は機能し、理解しやすいです(out出力ディレクトリと{1..9}実際の番号の範囲に置き換えてください。

for x in {1..9}
do
if [ -e ${x}original.jpg ]
then
mv $x.jpg out
mv ${x}original.jpg out
fi
done

もちろん、1行で入力することもできます。

于 2012-07-30T19:24:02.963 に答える
-1

正規表現ステートメントを使用して、調べているファイル名の「一致」を見つけることができます。次に、見つけた「一致」に対してアクションを実行します。

于 2012-07-30T19:14:10.273 に答える
-1

integer=0; while [ $integer -le 9 ] ; do if [ -e ${integer}original.jpg ] ; then mv -vi ${integer}.jpg ${integer}original.jpg lol/ ; fi ; integer=$[ $integer + 1 ] ; done

ここで、「lol」は宛先ディレクトリであることに注意してください。好きなように変更できます。また、9inを変更してwhile [ $integer -le 9 ]、9より大きい整数をチェックすることもできます。現在、0 *で開始し、9*をチェックした後に停止します。

編集:必要に応じて、コード内のセミコロンをキャリッジリターンに置き換えることができ、読みやすくなる場合があります。また、すぐにはわからない場合でも、この方法でブロック全体をターミナルに貼り付けることができます。

于 2012-07-30T19:18:52.243 に答える